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 000000000..9638be25b Binary files /dev/null and b/assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png differ 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, }