From 17b13f6c6cc8f8c9e54045470d6d2071116c250f Mon Sep 17 00:00:00 2001 From: somegituser Date: Fri, 8 Sep 2023 01:14:18 +0800 Subject: [PATCH] add war_archive: Inverted orthant (#3089) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增作战档案:负象限作战 --- .../TEMPLATE_INVERTED_ORTHANT.png | Bin 0 -> 34247 bytes campaign/Readme.md | 27 +--- campaign/war_archives_20201229_cn/a1.py | 100 ++++++++++++++ campaign/war_archives_20201229_cn/a2.py | 73 ++++++++++ campaign/war_archives_20201229_cn/a3.py | 73 ++++++++++ campaign/war_archives_20201229_cn/b1.py | 104 ++++++++++++++ campaign/war_archives_20201229_cn/b2.py | 82 +++++++++++ campaign/war_archives_20201229_cn/b3.py | 94 +++++++++++++ campaign/war_archives_20201229_cn/c1.py | 103 ++++++++++++++ campaign/war_archives_20201229_cn/c2.py | 76 +++++++++++ campaign/war_archives_20201229_cn/c3.py | 78 +++++++++++ campaign/war_archives_20201229_cn/d1.py | 119 ++++++++++++++++ campaign/war_archives_20201229_cn/d2.py | 84 ++++++++++++ campaign/war_archives_20201229_cn/d3.py | 128 ++++++++++++++++++ module/config/argument/args.json | 9 +- 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/war_archives/assets.py | 1 + module/war_archives/dictionary.py | 1 + 21 files changed, 1132 insertions(+), 24 deletions(-) create mode 100644 assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png create mode 100644 campaign/war_archives_20201229_cn/a1.py create mode 100644 campaign/war_archives_20201229_cn/a2.py create mode 100644 campaign/war_archives_20201229_cn/a3.py create mode 100644 campaign/war_archives_20201229_cn/b1.py create mode 100644 campaign/war_archives_20201229_cn/b2.py create mode 100644 campaign/war_archives_20201229_cn/b3.py create mode 100644 campaign/war_archives_20201229_cn/c1.py create mode 100644 campaign/war_archives_20201229_cn/c2.py create mode 100644 campaign/war_archives_20201229_cn/c3.py create mode 100644 campaign/war_archives_20201229_cn/d1.py create mode 100644 campaign/war_archives_20201229_cn/d2.py create mode 100644 campaign/war_archives_20201229_cn/d3.py diff --git a/assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png b/assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png new file mode 100644 index 0000000000000000000000000000000000000000..9638be25bb28b1f0abee399409850ccccc49a6ba GIT binary patch literal 34247 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 literal 0 HcmV?d00001 diff --git a/campaign/Readme.md b/campaign/Readme.md index 2c8259d3b..d48f53d31 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -34,8 +34,9 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20221117 | war archives 20200903 cn | Stars of the Shimmering Fjord | 峡湾间的星辰 | Stars of the Shimmering Fjord | 輝ける峡湾の星 | - | | 20221117 | war archives 20210819 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - | | 20211028 | war archives 20211028 cn | Skybound Oratorio | 穹顶下的圣咏曲 | Skybound Oratorio | 神穹を衝く聖歌 | 穹頂下的聖詠曲 | -| 20230420 | war archives 20220210 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | 北境序曲 | +| 20230420 | war archives 20220210 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | 北境序曲 | | 20230511 | war archives 20220414 cn | Aurora Noctis | 永夜幻光 | Aurora Noctis | 極夜照らす幻光 | 永夜幻光 | +| 20230831 | war archives 20201229 cn | Inverted Orthant | 负象限作战 | Inverted Orthant | 虚畳なりし限象 | - | | 20200227 | event 20200227 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | - | | 20200312 | event 20200312 cn | The Solomon Ranger | 复刻斯图尔特的硝烟 | The Solomon Ranger Rerun | 南洋に靡く硝煙(復刻) | - | | 20200326 | event 20200326 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - | @@ -135,25 +136,11 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20230118 | raid 20220127 | - | - | - | - | 演習神秘事件調查 | | 20230202 | event 20200806 cn | The Enigma and the Shark | - | - | - | 復刻最重要的寶物 | | 20230216 | event 20220224 cn | Abyssal Refrain | - | - | - | 深度回音 | -| 20230223 | event 20230223 cn | Revelations of Dust | 湮烬尘墟 | Revelations of Dust | 黙示の遺構 | - | +| 20230223 | event 20230223 cn | Revelations of Dust | 湮烬尘墟 | Revelations of Dust | 黙示の遺構 | - | | 20230309 | event 20210624 cn | Swirling Cherry Blossoms | - | - | - | 復刻-浮櫻影華 | -| 20230309 | event 20210422 cn | Daedalian Hymn | 复刻复兴的赞美诗 | Daedalian Hymn Rerun | 讃える復興の迷路(復刻) | - | +| 20230309 | event 20210422 cn | Daedalian Hymn | 复刻复兴的赞美诗 | Daedalian Hymn Rerun | 讃える復興の迷路(復刻) | - | | 20230323 | raid 20220630 | Angel of Iris | - | - | - | 來自鳶尾的天使 | -| 20230323 | coalition 20230323 | Frostfall | 极地风暴 | Frostfall | 星霜海嵐 | - | -| 20230413 | event 20211111 cn | The Flame-Touched Dagger | 复刻杰诺瓦的焰火 | The Flame-Touched Dagger Rerun | 復刻-燈火のシニエ | - | +| 20230323 | coalition 20230323 | Frostfall | 极地风暴 | Frostfall | 星霜海嵐 | - | +| 20230413 | event 20211111 cn | The Flame-Touched Dagger | 复刻杰诺瓦的焰火 | The Flame-Touched Dagger Rerun | 復刻-燈火のシニエ | - | | 20230413 | event 20210819 cn | Microlayer Medley | - | - | - | 復刻-微層混合 | -| 20230427 | event 20201126 cn | Vacation Lane | 假日航线 | Vacation Lane | バケーションレーン | 假日航線 | -| 20230525 | event 20220526 cn | Pledge of the Radiant Court | - | - | - | 泠誓光庭 | -| 20230525 | event 20230525 cn | Confluence of Nothingness | 空相交汇点 | Confluence of Nothingness | 覆天せし万象の塵 | - | -| 20230615 | event 20200603 cn | Counterattack Within the Fjord | - | - | - | 復刻峽灣間的反擊 | -| 20230621 | event 20210527 cn | Mirror Involution Rerun | 复刻镜位螺旋 | Mirror Involution Rerun | 照らす螺旋の鏡海(復刻) | - | -| 20230629 | event 20220428 cn | Rondo at Rainbow's End | - | - | - | 虹彩的終幕曲 | -| 20230629 | raid 20230629 | Reflections of the Oasis | 绿洲往事 | Reflections of the Oasis | 緑地伽話 | - | -| 20230713 | event 20220818 cn | Operation Convergence | - | - | 結像点作戦 | 遠匯點作戰 | -| 20230720 | event 20211125 cn | World-spanning Arclight | 复刻交汇世界的弧光 | World-spanning Arclight Rerun | 弧光は交わる世界にて(復刻) | - | -| 20230727 | event 20200917 cn | Dreamwaker's Butterfly | - | - | - | 復刻-蝶海夢花 | -| 20230803 | event 20211125 cn | World-spanning Arclight | - | - | - | 復刻-交匯世界的弧光 | -| 20230803 | event 20230803 cn | Anthem of Remembrance | 奏响鸢尾之歌 | Anthem of Remembrance | 燃ゆる聖都の回想曲 | - | -| 20230817 | event 20230817 cn | The Fool's Scales | 愚者的天平 | The Fool's Scales | 愚者の天秤 | - | -| 20230817 | event 20220414 cn | Aurora Noctis | - | - | - | 復刻-永夜幻光 | -| 20230824 | coalition 20230323 | Frostfall | - | - | - | 極地風暴 | +| 20230427 | event 20201126 cn | Vacation Lane | 假日航线 | Vacation Lane | バケーションレーン | 假日航線 | diff --git a/campaign/war_archives_20201229_cn/a1.py b/campaign/war_archives_20201229_cn/a1.py new file mode 100644 index 000000000..f2c5f4aa8 --- /dev/null +++ b/campaign/war_archives_20201229_cn/a1.py @@ -0,0 +1,100 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('A1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['D2', 'D5'] +MAP.map_data = """ + ++ -- MS -- ME -- -- ++ ++ + SP -- -- ++ ME -- Me ++ ++ + -- -- -- -- __ -- -- Me -- + SP -- -- MS -- ME -- -- -- + ++ ++ -- ++ ++ ++ -- ++ ++ + ++ ME -- ME MB ME -- ME ++ + -- -- -- -- -- -- -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 10 90 90 + 50 50 50 50 50 50 10 90 90 + 50 50 50 50 50 50 10 10 10 + 50 50 50 50 50 50 50 50 50 + 50 50 50 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': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1, 'boss': 1}, + {'battle': 4}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1, 'boss': 1}, + {'battle': 4, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['DD', '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 + # ===== End of generated config ===== + + MAP_HAS_MYSTERY = False + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 24), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 24, 255), + 'prominence': 10, + 'distance': 50, + 'width': (0, 10), + 'wlen': 1000, + } + MAP_SWIPE_MULTIPLY = (1.196, 1.218) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.156, 1.178) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.122, 1.143) + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20201229_cn/a2.py b/campaign/war_archives_20201229_cn/a2.py new file mode 100644 index 000000000..bba04c0a1 --- /dev/null +++ b/campaign/war_archives_20201229_cn/a2.py @@ -0,0 +1,73 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'J6' +MAP.camera_data = ['D2', 'D4', 'G2', 'G4'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + ++ SP -- SP -- -- ++ -- ++ ++ + ++ -- -- -- -- -- -- ME -- ++ + ME -- MS ++ -- MS -- -- ME -- + ME -- -- -- -- ++ ME __ -- MB + -- Me ++ ++ Me ++ -- -- ME -- + -- -- ++ ++ -- -- -- ME -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 10 10 10 10 50 50 50 50 50 + 50 10 90 90 10 50 50 50 50 50 + 50 10 90 90 10 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'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': 1}, + {'battle': 2, 'enemy': 1}, + {'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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Dorsetshire', 'Rodney', 'ArkRoyal'] + 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 + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20201229_cn/a3.py b/campaign/war_archives_20201229_cn/a3.py new file mode 100644 index 000000000..04dc95405 --- /dev/null +++ b/campaign/war_archives_20201229_cn/a3.py @@ -0,0 +1,73 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'J6' +MAP.camera_data = ['D2', 'D4', 'G2', 'G4'] +MAP.camera_data_spawn_point = ['D4'] +MAP.map_data = """ + -- -- ME -- ++ ++ -- ++ ++ ++ + -- ++ -- Me ++ ++ Me -- ME ME + ++ MS -- -- MB MB -- -- -- -- + ++ -- -- -- -- -- __ ++ ++ ME + SP -- -- MS ME ME -- ME ++ -- + -- SP -- ++ ++ ++ -- -- ME -- +""" +MAP.weight_data = """ + 50 50 50 10 90 90 10 50 50 50 + 50 50 50 10 90 90 10 50 50 50 + 50 50 50 10 10 10 10 50 50 50 + 50 50 50 50 50 50 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': 1}, + {'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': 1}, + {'battle': 2, 'enemy': 1}, + {'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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Kongo', 'Yamashiro'] + 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 + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20201229_cn/b1.py b/campaign/war_archives_20201229_cn/b1.py new file mode 100644 index 000000000..2dd01417b --- /dev/null +++ b/campaign/war_archives_20201229_cn/b1.py @@ -0,0 +1,104 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('B1') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + -- -- ++ -- -- ME ++ ++ ++ + -- ++ ++ Me -- -- ME -- -- + ++ ++ ++ -- ++ -- -- -- MB + -- Me -- Me -- -- ME -- -- + -- -- MS -- __ MS ++ ++ ME + ++ ++ ++ -- -- -- ++ ME -- + ++ -- SP -- MS -- -- -- ME + ++ -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 4, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, + {'battle': 5, 'enemy': 1}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, '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 = ['Z24', 'Nuremberg', 'Carabiniere'] + 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 + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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_SWIPE_MULTIPLY = (1.021, 1.041) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.988, 1.006) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.959, 0.976) + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + HOMO_EDGE_HOUGHLINES_THRESHOLD = 180 + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20201229_cn/b2.py b/campaign/war_archives_20201229_cn/b2.py new file mode 100644 index 000000000..43c9b608b --- /dev/null +++ b/campaign/war_archives_20201229_cn/b2.py @@ -0,0 +1,82 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'K7' +MAP.camera_data = ['D3', 'D5', 'H3', 'H5'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- ++ -- ++ ++ ++ MB MB ++ ++ ++ + -- -- -- ++ -- ME -- -- -- ME ++ + SP -- SP ++ ME -- ++ ME -- ME ++ + -- -- -- -- -- __ -- ++ -- -- -- + ++ -- ++ ++ ME -- ME -- -- Me Me + MS -- MS ++ -- -- -- -- Me ++ ++ + -- MS -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 4, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, '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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Z24', 'Carabiniere', 'Kongo', 'Yamashiro'] + 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 + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.167, 1.189) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.128, 1.149) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.095, 1.115) + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20201229_cn/b3.py b/campaign/war_archives_20201229_cn/b3.py new file mode 100644 index 000000000..f152b7f28 --- /dev/null +++ b/campaign/war_archives_20201229_cn/b3.py @@ -0,0 +1,94 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'J10' +MAP.camera_data = ['D2', 'D6', 'D8', 'G2', 'G6', 'G8'] +MAP.camera_data_spawn_point = ['D8', 'G8'] +MAP.map_data = """ + ++ -- -- ME -- -- ME -- -- ++ + -- -- ++ -- MB MB -- ++ -- -- + ++ -- -- ME -- -- ME -- -- ++ + -- ++ ++ ME -- -- ME ++ ++ -- + ++ ++ MS -- __ __ -- MS ++ ++ + ++ ME -- -- ++ ++ -- -- ME ++ + -- ME -- Me ++ ++ Me -- ME -- + ++ ++ -- -- Me Me -- -- ++ ++ + -- ++ MS -- -- -- -- MS ++ -- + -- ++ ++ ++ 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 10 10 10 10 50 50 50 + 50 50 50 10 90 90 10 50 50 50 + 50 50 50 10 90 90 10 50 50 50 + 50 50 50 10 10 10 10 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': 4, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, '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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['DD', 'CL', 'Intruder'] + 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 + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (0.946, 0.963) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.914, 0.931) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.888, 0.904) + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20201229_cn/c1.py b/campaign/war_archives_20201229_cn/c1.py new file mode 100644 index 000000000..a5f872d0c --- /dev/null +++ b/campaign/war_archives_20201229_cn/c1.py @@ -0,0 +1,103 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('C1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D4', 'F2', 'F4'] +MAP.camera_data_spawn_point = ['D2', 'D5'] +MAP.map_data = """ + ++ -- MS -- ME -- -- ++ ++ + SP -- -- ++ ME -- Me ++ ++ + -- -- -- -- __ -- -- Me -- + SP -- -- MS -- ME -- -- -- + ++ ++ -- ++ ++ ++ -- ++ ++ + ++ ME -- ME MB ME -- ME ++ + -- -- -- -- -- -- -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 10 90 90 + 50 50 50 50 50 50 10 90 90 + 50 50 50 50 50 50 10 10 10 + 50 50 50 50 50 50 50 50 50 + 50 50 50 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': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'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, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['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 + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 180 + MAP_SWIPE_MULTIPLY = (1.196, 1.218) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.156, 1.178) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.122, 1.143) + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20201229_cn/c2.py b/campaign/war_archives_20201229_cn/c2.py new file mode 100644 index 000000000..79ac9b8f3 --- /dev/null +++ b/campaign/war_archives_20201229_cn/c2.py @@ -0,0 +1,76 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'J6' +MAP.camera_data = ['D2', 'D4', 'G2', 'G4'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + ++ SP -- SP -- -- ++ -- ++ ++ + ++ -- -- -- -- -- -- ME -- ++ + ME -- MS ++ -- MS -- -- ME -- + ME -- -- -- -- ++ ME __ -- MB + -- Me ++ ++ Me ++ -- -- ME -- + -- -- ++ ++ -- -- -- ME -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 10 10 10 10 50 50 50 50 50 + 50 10 90 90 10 50 50 50 50 50 + 50 10 90 90 10 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Dorsetshire', 'Rodney', 'ArkRoyal'] + 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 + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20201229_cn/c3.py b/campaign/war_archives_20201229_cn/c3.py new file mode 100644 index 000000000..ee2da695b --- /dev/null +++ b/campaign/war_archives_20201229_cn/c3.py @@ -0,0 +1,78 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'J6' +MAP.camera_data = ['D2', 'D4', 'G2', 'G4'] +MAP.camera_data_spawn_point = ['D4'] +MAP.map_data = """ + -- -- ME -- ++ ++ -- ++ ++ ++ + -- ++ -- Me ++ ++ Me -- ME ME + ++ MS -- -- MB MB -- -- -- -- + ++ -- -- -- -- -- __ ++ ++ ME + SP -- -- MS ME ME -- ME ++ -- + -- SP -- ++ ++ ++ -- -- ME -- +""" +MAP.weight_data = """ + 50 50 50 10 90 90 10 50 50 50 + 50 50 50 10 90 90 10 50 50 50 + 50 50 50 10 10 10 10 50 50 50 + 50 50 50 50 50 50 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': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'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, \ +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Kongo', 'Yamashiro', 'Shokaku', 'Zuikaku'] + 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 + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20201229_cn/d1.py b/campaign/war_archives_20201229_cn/d1.py new file mode 100644 index 000000000..8d5c3642c --- /dev/null +++ b/campaign/war_archives_20201229_cn/d1.py @@ -0,0 +1,119 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('D1') +MAP.shape = 'I8' +MAP.camera_data = ['D3', 'D6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + -- -- ++ -- -- ME ++ ++ ++ + -- ++ ++ Me -- -- ME -- -- + ++ ++ ++ -- ++ -- -- -- MB + -- Me -- Me -- -- ME -- -- + -- -- MS -- __ MS ++ ++ ME + ++ ++ ++ -- -- -- ++ ME -- + ++ -- SP -- MS -- -- -- ME + ++ -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 4, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, '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 = ['Z24', 'Nuremberg', 'Carabiniere'] + 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 + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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) + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40 + EDGE_LINES_HOUGHLINES_THRESHOLD = 40 + COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5 + HOMO_EDGE_HOUGHLINES_THRESHOLD = 180 + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_SWIPE_MULTIPLY = (1.033, 1.053) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.999, 1.018) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.970, 0.988) + MAP_ENEMY_TEMPLATE = ['LightInvertedOrthant', 'MainInvertedOrthant', 'CarrierInvertedOrthant'] + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,), genre=['LightInvertedOrthant', 'MainInvertedOrthant']): + return True + if self.clear_enemy(scale=(3,), genre=['LightInvertedOrthant', 'MainInvertedOrthant']): + return True + if self.clear_enemy(scale=(2,), genre=['Enemy', 'CarrierInvertedOrthant']): + return True + if self.clear_enemy(scale=(3,), genre=['Enemy', 'CarrierInvertedOrthant']): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20201229_cn/d2.py b/campaign/war_archives_20201229_cn/d2.py new file mode 100644 index 000000000..bbd8ce033 --- /dev/null +++ b/campaign/war_archives_20201229_cn/d2.py @@ -0,0 +1,84 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'K7' +MAP.camera_data = ['D3', 'D5', 'H3', 'H5'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- ++ -- ++ ++ ++ MB MB ++ ++ ++ + -- -- -- ++ -- ME -- -- -- ME ++ + SP -- SP ++ ME -- ++ ME -- ME ++ + -- -- -- -- -- __ -- ++ -- -- -- + ++ -- ++ ++ ME -- ME -- -- Me Me + MS -- MS ++ -- -- -- -- Me ++ ++ + -- MS -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 4, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Z24', 'Carabiniere', 'Kongo', 'Yamashiro'] + 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 + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.167, 1.189) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.128, 1.149) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.095, 1.115) + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20201229_cn/d3.py b/campaign/war_archives_20201229_cn/d3.py new file mode 100644 index 000000000..2c933eae1 --- /dev/null +++ b/campaign/war_archives_20201229_cn/d3.py @@ -0,0 +1,128 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'J10' +MAP.camera_data = ['D2', 'D6', 'D8', 'G2', 'G6', 'G8'] +MAP.camera_data_spawn_point = ['D8', 'G8'] +MAP.map_data = """ + ++ -- -- ME -- -- ME -- -- ++ + -- -- ++ -- MB MB -- ++ -- -- + ++ -- -- ME -- -- ME -- -- ++ + -- ++ ++ ME -- -- ME ++ ++ -- + ++ ++ MS -- __ __ -- MS ++ ++ + ++ ME -- -- ++ ++ -- -- ME ++ + -- ME -- Me ++ ++ Me -- ME -- + ++ ++ -- -- Me Me -- -- ++ ++ + -- ++ MS -- -- -- -- MS ++ -- + -- ++ ++ ++ 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 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 4, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BBpurple', 'CVpurple', 'Intruder'] + 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 + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (0.946, 0.963) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.914, 0.931) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.888, 0.904) + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'BBpurple': 1.111, + 'CVpurple': 1.111, + } + MAP_ENEMY_TEMPLATE = ['MainPurple', 'CarrierPurple'] + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,), genre=['LightInvertedOrthant', 'MainInvertedOrthant']): + return True + if self.clear_enemy(scale=(3,), genre=['LightInvertedOrthant', 'MainInvertedOrthant']): + return True + if self.clear_enemy(scale=(2,), genre=['Enemy', 'CarrierInvertedOrthant']): + return True + if self.clear_enemy(scale=(3,), genre=['Enemy', 'CarrierInvertedOrthant']): + return True + + return self.battle_default() + + def battle_5(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,), genre=['LightInvertedOrthant', 'MainInvertedOrthant']): + return True + if self.clear_enemy(scale=(3,), genre=['LightInvertedOrthant', 'MainInvertedOrthant']): + return True + if self.clear_enemy(scale=(2,), genre=['Enemy', 'CarrierInvertedOrthant']): + return True + if self.clear_enemy(scale=(3,), genre=['Enemy', 'CarrierInvertedOrthant']): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 90f2852b7..d8b08f7f4 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3289,6 +3289,7 @@ "type": "select", "value": "campaign_main", "option": [ + "war_archives_20201229_cn", "war_archives_20220414_cn", "war_archives_20220210_cn", "war_archives_20211028_cn", @@ -3312,10 +3313,10 @@ "war_archives_20191031_en", "war_archives_20181020_en" ], - "cn": "war_archives_20220414_cn", - "en": "war_archives_20220414_cn", - "jp": "war_archives_20220414_cn", - "tw": "war_archives_20220414_cn" + "cn": "war_archives_20201229_cn", + "en": "war_archives_20201229_cn", + "jp": "war_archives_20201229_cn", + "tw": "war_archives_20201229_cn" }, "Mode": { "type": "select", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 6f6dd4ab1..8f9cabe7c 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -708,6 +708,7 @@ "event_20200423_cn": "Crimson Echoes Rerun", "event_20200326_cn": "Microlayer Medley", "event_20200227_cn": "Northern Overture", + "war_archives_20201229_cn": "archives Inverted Orthant", "war_archives_20220414_cn": "archives Aurora Noctis", "war_archives_20220210_cn": "archives Northern Overture", "war_archives_20211028_cn": "archives Skybound Oratorio", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index f67808b98..20eafc10f 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -708,6 +708,7 @@ "event_20200423_cn": "縹映る深緋の残響(復刻)", "event_20200326_cn": "闇靄払う銀翼", "event_20200227_cn": "凍絶の北海", + "war_archives_20201229_cn": "檔案 虚畳なりし限象", "war_archives_20220414_cn": "檔案 極夜照らす幻光", "war_archives_20220210_cn": "檔案 凍絶の北海", "war_archives_20211028_cn": "檔案 神穹を衝く聖歌", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 447f73d28..8e8f08ed6 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -708,6 +708,7 @@ "event_20200423_cn": "复刻苍红的回响", "event_20200326_cn": "微层混合", "event_20200227_cn": "北境序曲", + "war_archives_20201229_cn": "档案 负象限作战", "war_archives_20220414_cn": "档案 永夜幻光", "war_archives_20220210_cn": "档案 北境序曲", "war_archives_20211028_cn": "档案 穹顶下的圣咏曲", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index f2f112709..94affec0a 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -708,6 +708,7 @@ "event_20200423_cn": "Crimson Echoes Rerun", "event_20200326_cn": "Microlayer Medley", "event_20200227_cn": "Northern Overture", + "war_archives_20201229_cn": "檔案 負象限作戰", "war_archives_20220414_cn": "檔案 永夜幻光", "war_archives_20220210_cn": "檔案 北境序曲", "war_archives_20211028_cn": "檔案 穹頂下的聖詠曲", diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index 5b2b6b7ba..c0f66a7d2 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -15,6 +15,7 @@ TEMPLATE_ENCIRCLING_GRAF_SPEE = Template(file={'cn': './assets/cn/war_archives/T TEMPLATE_FALLEN_WINGS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_FALLEN_WINGS.png', 'en': './assets/en/war_archives/TEMPLATE_FALLEN_WINGS.png', 'jp': './assets/jp/war_archives/TEMPLATE_FALLEN_WINGS.png', 'tw': './assets/tw/war_archives/TEMPLATE_FALLEN_WINGS.png'}) TEMPLATE_GLORIOUS_BATTLE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_GLORIOUS_BATTLE.png', 'en': './assets/en/war_archives/TEMPLATE_GLORIOUS_BATTLE.png', 'jp': './assets/jp/war_archives/TEMPLATE_GLORIOUS_BATTLE.png', 'tw': './assets/tw/war_archives/TEMPLATE_GLORIOUS_BATTLE.png'}) TEMPLATE_INK_STAINED_STEEL_SAKURA = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_INK_STAINED_STEEL_SAKURA.png', 'en': './assets/en/war_archives/TEMPLATE_INK_STAINED_STEEL_SAKURA.png', 'jp': './assets/jp/war_archives/TEMPLATE_INK_STAINED_STEEL_SAKURA.png', 'tw': './assets/cn/war_archives/TEMPLATE_INK_STAINED_STEEL_SAKURA.png'}) +TEMPLATE_INVERTED_ORTHANT = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png', 'en': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png', 'jp': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png', 'tw': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png'}) TEMPLATE_IRIS_OF_LIGHT_AND_DARK = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png', 'en': './assets/en/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png', 'jp': './assets/jp/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png', 'tw': './assets/cn/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png'}) TEMPLATE_MICROLAYER_MEDLEY = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'en': './assets/en/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'jp': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'tw': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png'}) TEMPLATE_NORTHERN_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'en': './assets/en/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index 595355834..e830afeea 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -23,4 +23,5 @@ dic_archives_template = { 'war_archives_20210819_cn': TEMPLATE_MICROLAYER_MEDLEY, 'war_archives_20220210_cn': TEMPLATE_NORTHERN_OVERTURE, 'war_archives_20220414_cn': TEMPLATE_AURORA_NOCTIS, + 'war_archives_20201229_cn': TEMPLATE_INVERTED_ORTHANT, }