Add: [CN] Assets for coalition_20240627

This commit is contained in:
LmeSzinc 2024-06-28 01:18:59 +08:00
parent 752d4ea043
commit a8f8432842
29 changed files with 244 additions and 82 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -568,7 +568,7 @@
"ServerUpdate": "00:00"
},
"Campaign": {
"Name": "TC-3",
"Name": "dynamic",
"Event": "campaign_main",
"Mode": "normal",
"UseClearMode": true,
@ -578,6 +578,7 @@
"AmbushEvade": true
},
"Coalition": {
"Mode": "hard",
"Fleet": "single"
},
"StopCondition": {
@ -1148,6 +1149,7 @@
"AmbushEvade": true
},
"Coalition": {
"Mode": "hard",
"Fleet": "single"
},
"StopCondition": {

View File

@ -4,6 +4,17 @@ from module.base.template import Template
# This file was automatically generated by dev_tools/button_extract.py.
# Don't modify it manually.
ACADEMY_EASY = Button(area={'cn': (201, 290, 243, 311), 'en': (201, 290, 243, 311), 'jp': (201, 290, 243, 311), 'tw': (201, 290, 243, 311)}, color={'cn': (172, 141, 121), 'en': (172, 141, 121), 'jp': (172, 141, 121), 'tw': (172, 141, 121)}, button={'cn': (201, 290, 243, 311), 'en': (201, 290, 243, 311), 'jp': (201, 290, 243, 311), 'tw': (201, 290, 243, 311)}, file={'cn': './assets/cn/coalition/ACADEMY_EASY.png', 'en': './assets/cn/coalition/ACADEMY_EASY.png', 'jp': './assets/cn/coalition/ACADEMY_EASY.png', 'tw': './assets/cn/coalition/ACADEMY_EASY.png'})
ACADEMY_EX = Button(area={'cn': (712, 178, 744, 196), 'en': (712, 178, 744, 196), 'jp': (712, 178, 744, 196), 'tw': (712, 178, 744, 196)}, color={'cn': (151, 200, 191), 'en': (151, 200, 191), 'jp': (151, 200, 191), 'tw': (151, 200, 191)}, button={'cn': (712, 178, 744, 196), 'en': (712, 178, 744, 196), 'jp': (712, 178, 744, 196), 'tw': (712, 178, 744, 196)}, file={'cn': './assets/cn/coalition/ACADEMY_EX.png', 'en': './assets/cn/coalition/ACADEMY_EX.png', 'jp': './assets/cn/coalition/ACADEMY_EX.png', 'tw': './assets/cn/coalition/ACADEMY_EX.png'})
ACADEMY_HARD = Button(area={'cn': (956, 503, 1000, 524), 'en': (956, 503, 1000, 524), 'jp': (956, 503, 1000, 524), 'tw': (956, 503, 1000, 524)}, color={'cn': (169, 137, 118), 'en': (169, 137, 118), 'jp': (169, 137, 118), 'tw': (169, 137, 118)}, button={'cn': (956, 503, 1000, 524), 'en': (956, 503, 1000, 524), 'jp': (956, 503, 1000, 524), 'tw': (956, 503, 1000, 524)}, file={'cn': './assets/cn/coalition/ACADEMY_HARD.png', 'en': './assets/cn/coalition/ACADEMY_HARD.png', 'jp': './assets/cn/coalition/ACADEMY_HARD.png', 'tw': './assets/cn/coalition/ACADEMY_HARD.png'})
ACADEMY_MODE_BATTLE = Button(area={'cn': (105, 654, 182, 675), 'en': (105, 654, 182, 675), 'jp': (105, 654, 182, 675), 'tw': (105, 654, 182, 675)}, color={'cn': (207, 169, 129), 'en': (207, 169, 129), 'jp': (207, 169, 129), 'tw': (207, 169, 129)}, button={'cn': (105, 654, 182, 675), 'en': (105, 654, 182, 675), 'jp': (105, 654, 182, 675), 'tw': (105, 654, 182, 675)}, file={'cn': './assets/cn/coalition/ACADEMY_MODE_BATTLE.png', 'en': './assets/cn/coalition/ACADEMY_MODE_BATTLE.png', 'jp': './assets/cn/coalition/ACADEMY_MODE_BATTLE.png', 'tw': './assets/cn/coalition/ACADEMY_MODE_BATTLE.png'})
ACADEMY_MODE_STORY = Button(area={'cn': (224, 654, 302, 675), 'en': (224, 654, 302, 675), 'jp': (224, 654, 302, 675), 'tw': (224, 654, 302, 675)}, color={'cn': (210, 175, 139), 'en': (210, 175, 139), 'jp': (210, 175, 139), 'tw': (210, 175, 139)}, button={'cn': (224, 654, 302, 675), 'en': (224, 654, 302, 675), 'jp': (224, 654, 302, 675), 'tw': (224, 654, 302, 675)}, file={'cn': './assets/cn/coalition/ACADEMY_MODE_STORY.png', 'en': './assets/cn/coalition/ACADEMY_MODE_STORY.png', 'jp': './assets/cn/coalition/ACADEMY_MODE_STORY.png', 'tw': './assets/cn/coalition/ACADEMY_MODE_STORY.png'})
ACADEMY_NORMAL = Button(area={'cn': (604, 411, 646, 433), 'en': (604, 411, 646, 433), 'jp': (604, 411, 646, 433), 'tw': (604, 411, 646, 433)}, color={'cn': (169, 137, 118), 'en': (169, 137, 118), 'jp': (169, 137, 118), 'tw': (169, 137, 118)}, button={'cn': (604, 411, 646, 433), 'en': (604, 411, 646, 433), 'jp': (604, 411, 646, 433), 'tw': (604, 411, 646, 433)}, file={'cn': './assets/cn/coalition/ACADEMY_NORMAL.png', 'en': './assets/cn/coalition/ACADEMY_NORMAL.png', 'jp': './assets/cn/coalition/ACADEMY_NORMAL.png', 'tw': './assets/cn/coalition/ACADEMY_NORMAL.png'})
ACADEMY_PT_OCR = Button(area={'cn': (1125, 208, 1265, 225), 'en': (1125, 208, 1265, 225), 'jp': (1125, 208, 1265, 225), 'tw': (1125, 208, 1265, 225)}, color={'cn': (124, 105, 88), 'en': (124, 105, 88), 'jp': (124, 105, 88), 'tw': (124, 105, 88)}, button={'cn': (1125, 208, 1265, 225), 'en': (1125, 208, 1265, 225), 'jp': (1125, 208, 1265, 225), 'tw': (1125, 208, 1265, 225)}, file={'cn': './assets/cn/coalition/ACADEMY_PT_OCR.png', 'en': './assets/cn/coalition/ACADEMY_PT_OCR.png', 'jp': './assets/cn/coalition/ACADEMY_PT_OCR.png', 'tw': './assets/cn/coalition/ACADEMY_PT_OCR.png'})
ACADEMY_SP = Button(area={'cn': (333, 580, 362, 597), 'en': (333, 580, 362, 597), 'jp': (333, 580, 362, 597), 'tw': (333, 580, 362, 597)}, color={'cn': (176, 146, 126), 'en': (176, 146, 126), 'jp': (176, 146, 126), 'tw': (176, 146, 126)}, button={'cn': (333, 580, 362, 597), 'en': (333, 580, 362, 597), 'jp': (333, 580, 362, 597), 'tw': (333, 580, 362, 597)}, file={'cn': './assets/cn/coalition/ACADEMY_SP.png', 'en': './assets/cn/coalition/ACADEMY_SP.png', 'jp': './assets/cn/coalition/ACADEMY_SP.png', 'tw': './assets/cn/coalition/ACADEMY_SP.png'})
ACADEMY_SWITCH_MULTI = Button(area={'cn': (1088, 458, 1216, 486), 'en': (1088, 458, 1216, 486), 'jp': (1088, 458, 1216, 486), 'tw': (1088, 458, 1216, 486)}, color={'cn': (234, 184, 61), 'en': (234, 184, 61), 'jp': (234, 184, 61), 'tw': (234, 184, 61)}, button={'cn': (1088, 458, 1216, 486), 'en': (1088, 458, 1216, 486), 'jp': (1088, 458, 1216, 486), 'tw': (1088, 458, 1216, 486)}, file={'cn': './assets/cn/coalition/ACADEMY_SWITCH_MULTI.png', 'en': './assets/cn/coalition/ACADEMY_SWITCH_MULTI.png', 'jp': './assets/cn/coalition/ACADEMY_SWITCH_MULTI.png', 'tw': './assets/cn/coalition/ACADEMY_SWITCH_MULTI.png'})
ACADEMY_SWITCH_SINGLE = Button(area={'cn': (941, 458, 1070, 486), 'en': (941, 458, 1070, 486), 'jp': (941, 458, 1070, 486), 'tw': (941, 458, 1070, 486)}, color={'cn': (232, 182, 60), 'en': (232, 182, 60), 'jp': (232, 182, 60), 'tw': (232, 182, 60)}, button={'cn': (941, 458, 1070, 486), 'en': (941, 458, 1070, 486), 'jp': (941, 458, 1070, 486), 'tw': (941, 458, 1070, 486)}, file={'cn': './assets/cn/coalition/ACADEMY_SWITCH_SINGLE.png', 'en': './assets/cn/coalition/ACADEMY_SWITCH_SINGLE.png', 'jp': './assets/cn/coalition/ACADEMY_SWITCH_SINGLE.png', 'tw': './assets/cn/coalition/ACADEMY_SWITCH_SINGLE.png'})
ACEDEMY_FLEET_PREPARATION = Button(area={'cn': (1025, 537, 1132, 562), 'en': (1025, 537, 1132, 562), 'jp': (1025, 537, 1132, 562), 'tw': (1025, 537, 1132, 562)}, color={'cn': (106, 149, 226), 'en': (106, 149, 226), 'jp': (106, 149, 226), 'tw': (106, 149, 226)}, button={'cn': (1025, 537, 1132, 562), 'en': (1025, 537, 1132, 562), 'jp': (1025, 537, 1132, 562), 'tw': (1025, 537, 1132, 562)}, file={'cn': './assets/cn/coalition/ACEDEMY_FLEET_PREPARATION.png', 'en': './assets/cn/coalition/ACEDEMY_FLEET_PREPARATION.png', 'jp': './assets/cn/coalition/ACEDEMY_FLEET_PREPARATION.png', 'tw': './assets/cn/coalition/ACEDEMY_FLEET_PREPARATION.png'})
COALITION_ACADEMY_BACK = Button(area={'cn': (44, 48, 62, 74), 'en': (44, 48, 62, 74), 'jp': (44, 48, 62, 74), 'tw': (44, 48, 62, 74)}, color={'cn': (162, 188, 194), 'en': (162, 188, 194), 'jp': (162, 188, 194), 'tw': (162, 188, 194)}, button={'cn': (44, 48, 62, 74), 'en': (44, 48, 62, 74), 'jp': (44, 48, 62, 74), 'tw': (44, 48, 62, 74)}, file={'cn': './assets/cn/coalition/COALITION_ACADEMY_BACK.png', 'en': './assets/cn/coalition/COALITION_ACADEMY_BACK.png', 'jp': './assets/cn/coalition/COALITION_ACADEMY_BACK.png', 'tw': './assets/cn/coalition/COALITION_ACADEMY_BACK.png'})
COALITION_ACADEMY_CAMPAIGN_CHECK = Button(area={'cn': (131, 50, 168, 83), 'en': (131, 50, 168, 83), 'jp': (131, 50, 168, 83), 'tw': (131, 50, 168, 83)}, color={'cn': (165, 210, 212), 'en': (165, 210, 212), 'jp': (165, 210, 212), 'tw': (165, 210, 212)}, button={'cn': (131, 50, 168, 83), 'en': (131, 50, 168, 83), 'jp': (131, 50, 168, 83), 'tw': (131, 50, 168, 83)}, file={'cn': './assets/cn/coalition/COALITION_ACADEMY_CAMPAIGN_CHECK.png', 'en': './assets/cn/coalition/COALITION_ACADEMY_CAMPAIGN_CHECK.png', 'jp': './assets/cn/coalition/COALITION_ACADEMY_CAMPAIGN_CHECK.png', 'tw': './assets/cn/coalition/COALITION_ACADEMY_CAMPAIGN_CHECK.png'})
COALITION_ACADEMY_GOTO_CAMPAIGN = Button(area={'cn': (962, 645, 1009, 669), 'en': (962, 645, 1009, 669), 'jp': (962, 645, 1009, 669), 'tw': (962, 645, 1009, 669)}, color={'cn': (198, 166, 156), 'en': (198, 166, 156), 'jp': (198, 166, 156), 'tw': (198, 166, 156)}, button={'cn': (962, 645, 1009, 669), 'en': (962, 645, 1009, 669), 'jp': (962, 645, 1009, 669), 'tw': (962, 645, 1009, 669)}, file={'cn': './assets/cn/coalition/COALITION_ACADEMY_GOTO_CAMPAIGN.png', 'en': './assets/cn/coalition/COALITION_ACADEMY_GOTO_CAMPAIGN.png', 'jp': './assets/cn/coalition/COALITION_ACADEMY_GOTO_CAMPAIGN.png', 'tw': './assets/cn/coalition/COALITION_ACADEMY_GOTO_CAMPAIGN.png'})
@ -11,14 +22,14 @@ COALITION_ACADEMY_HOME = Button(area={'cn': (1221, 48, 1244, 73), 'en': (1221, 4
COALITION_ACADEMY_MAIN_CHECK = Button(area={'cn': (132, 57, 163, 92), 'en': (132, 57, 163, 92), 'jp': (132, 57, 163, 92), 'tw': (132, 57, 163, 92)}, color={'cn': (143, 202, 205), 'en': (143, 202, 205), 'jp': (143, 202, 205), 'tw': (143, 202, 205)}, button={'cn': (132, 57, 163, 92), 'en': (132, 57, 163, 92), 'jp': (132, 57, 163, 92), 'tw': (132, 57, 163, 92)}, file={'cn': './assets/cn/coalition/COALITION_ACADEMY_MAIN_CHECK.png', 'en': './assets/cn/coalition/COALITION_ACADEMY_MAIN_CHECK.png', 'jp': './assets/cn/coalition/COALITION_ACADEMY_MAIN_CHECK.png', 'tw': './assets/cn/coalition/COALITION_ACADEMY_MAIN_CHECK.png'})
COALITION_REWARD_CONFIRM = Button(area={'cn': (814, 611, 877, 637), 'en': (788, 612, 902, 634), 'jp': (814, 611, 876, 637), 'tw': (814, 611, 877, 637)}, color={'cn': (155, 186, 227), 'en': (162, 189, 226), 'jp': (143, 176, 219), 'tw': (150, 181, 221)}, button={'cn': (814, 611, 877, 637), 'en': (788, 612, 902, 634), 'jp': (814, 611, 876, 637), 'tw': (814, 611, 877, 637)}, file={'cn': './assets/cn/coalition/COALITION_REWARD_CONFIRM.png', 'en': './assets/en/coalition/COALITION_REWARD_CONFIRM.png', 'jp': './assets/jp/coalition/COALITION_REWARD_CONFIRM.png', 'tw': './assets/tw/coalition/COALITION_REWARD_CONFIRM.png'})
FLEET_NOT_PREPARED = Button(area={'cn': (1008, 310, 1110, 334), 'en': (1008, 310, 1110, 334), 'jp': (1008, 310, 1110, 334), 'tw': (1008, 310, 1110, 334)}, color={'cn': (106, 106, 112), 'en': (106, 106, 112), 'jp': (106, 106, 112), 'tw': (108, 107, 112)}, button={'cn': (1008, 310, 1110, 334), 'en': (1008, 310, 1110, 334), 'jp': (1008, 310, 1110, 334), 'tw': (1008, 310, 1110, 334)}, file={'cn': './assets/cn/coalition/FLEET_NOT_PREPARED.png', 'en': './assets/cn/coalition/FLEET_NOT_PREPARED.png', 'jp': './assets/cn/coalition/FLEET_NOT_PREPARED.png', 'tw': './assets/tw/coalition/FLEET_NOT_PREPARED.png'})
FLEET_PREPARATION = Button(area={'cn': (1057, 527, 1155, 548), 'en': (1114, 527, 1200, 545), 'jp': (1056, 525, 1157, 550), 'tw': (1057, 527, 1155, 548)}, color={'cn': (122, 146, 222), 'en': (106, 135, 228), 'jp': (115, 141, 222), 'tw': (110, 136, 224)}, button={'cn': (968, 511, 1245, 563), 'en': (968, 511, 1245, 563), 'jp': (968, 511, 1245, 563), 'tw': (968, 511, 1245, 563)}, file={'cn': './assets/cn/coalition/FLEET_PREPARATION.png', 'en': './assets/en/coalition/FLEET_PREPARATION.png', 'jp': './assets/jp/coalition/FLEET_PREPARATION.png', 'tw': './assets/tw/coalition/FLEET_PREPARATION.png'})
FLEET_SWITCH_MULTI = Button(area={'cn': (1106, 449, 1237, 478), 'en': (1106, 449, 1237, 478), 'jp': (1106, 449, 1237, 478), 'tw': (1106, 449, 1237, 478)}, color={'cn': (232, 175, 58), 'en': (197, 147, 49), 'jp': (220, 165, 55), 'tw': (225, 170, 59)}, button={'cn': (1106, 449, 1237, 478), 'en': (1106, 449, 1237, 478), 'jp': (1106, 449, 1237, 478), 'tw': (1106, 449, 1237, 478)}, file={'cn': './assets/cn/coalition/FLEET_SWITCH_MULTI.png', 'en': './assets/en/coalition/FLEET_SWITCH_MULTI.png', 'jp': './assets/jp/coalition/FLEET_SWITCH_MULTI.png', 'tw': './assets/tw/coalition/FLEET_SWITCH_MULTI.png'})
FLEET_SWITCH_SINGLE = Button(area={'cn': (968, 449, 1098, 478), 'en': (968, 449, 1098, 478), 'jp': (968, 449, 1098, 478), 'tw': (968, 449, 1098, 478)}, color={'cn': (230, 173, 57), 'en': (199, 148, 49), 'jp': (221, 166, 55), 'tw': (220, 166, 58)}, button={'cn': (968, 449, 1098, 478), 'en': (968, 449, 1098, 478), 'jp': (968, 449, 1098, 478), 'tw': (968, 449, 1098, 478)}, file={'cn': './assets/cn/coalition/FLEET_SWITCH_SINGLE.png', 'en': './assets/en/coalition/FLEET_SWITCH_SINGLE.png', 'jp': './assets/jp/coalition/FLEET_SWITCH_SINGLE.png', 'tw': './assets/tw/coalition/FLEET_SWITCH_SINGLE.png'})
FROSTFALL_EX = Button(area={'cn': (622, 372, 649, 384), 'en': (622, 372, 649, 384), 'jp': (622, 372, 649, 384), 'tw': (622, 372, 649, 384)}, color={'cn': (198, 152, 252), 'en': (198, 152, 252), 'jp': (198, 152, 252), 'tw': (182, 127, 252)}, button={'cn': (622, 372, 649, 384), 'en': (622, 372, 649, 384), 'jp': (622, 372, 649, 384), 'tw': (622, 372, 649, 384)}, file={'cn': './assets/cn/coalition/FROSTFALL_EX.png', 'en': './assets/en/coalition/FROSTFALL_EX.png', 'jp': './assets/jp/coalition/FROSTFALL_EX.png', 'tw': './assets/tw/coalition/FROSTFALL_EX.png'})
FROSTFALL_FLEET_PREPARATION = Button(area={'cn': (1057, 527, 1155, 548), 'en': (1057, 527, 1155, 548), 'jp': (1057, 527, 1155, 548), 'tw': (1057, 527, 1155, 548)}, color={'cn': (122, 146, 222), 'en': (122, 146, 222), 'jp': (122, 146, 222), 'tw': (122, 146, 222)}, button={'cn': (1057, 527, 1155, 548), 'en': (1057, 527, 1155, 548), 'jp': (1057, 527, 1155, 548), 'tw': (1057, 527, 1155, 548)}, file={'cn': './assets/cn/coalition/FROSTFALL_FLEET_PREPARATION.png', 'en': './assets/cn/coalition/FROSTFALL_FLEET_PREPARATION.png', 'jp': './assets/cn/coalition/FROSTFALL_FLEET_PREPARATION.png', 'tw': './assets/cn/coalition/FROSTFALL_FLEET_PREPARATION.png'})
FROSTFALL_MODE_BATTLE = Button(area={'cn': (71, 608, 137, 653), 'en': (71, 608, 137, 653), 'jp': (71, 608, 137, 653), 'tw': (71, 608, 137, 653)}, color={'cn': (63, 106, 122), 'en': (63, 106, 122), 'jp': (63, 106, 122), 'tw': (63, 106, 122)}, button={'cn': (71, 608, 137, 653), 'en': (71, 608, 137, 653), 'jp': (71, 608, 137, 653), 'tw': (71, 608, 137, 653)}, file={'cn': './assets/cn/coalition/FROSTFALL_MODE_BATTLE.png', 'en': './assets/cn/coalition/FROSTFALL_MODE_BATTLE.png', 'jp': './assets/cn/coalition/FROSTFALL_MODE_BATTLE.png', 'tw': './assets/cn/coalition/FROSTFALL_MODE_BATTLE.png'})
FROSTFALL_MODE_STORY = Button(area={'cn': (73, 610, 134, 652), 'en': (73, 610, 134, 652), 'jp': (73, 610, 134, 652), 'tw': (73, 610, 134, 652)}, color={'cn': (119, 44, 32), 'en': (119, 44, 32), 'jp': (119, 44, 32), 'tw': (119, 44, 32)}, button={'cn': (73, 610, 134, 652), 'en': (73, 610, 134, 652), 'jp': (73, 610, 134, 652), 'tw': (73, 610, 134, 652)}, file={'cn': './assets/cn/coalition/FROSTFALL_MODE_STORY.png', 'en': './assets/cn/coalition/FROSTFALL_MODE_STORY.png', 'jp': './assets/cn/coalition/FROSTFALL_MODE_STORY.png', 'tw': './assets/cn/coalition/FROSTFALL_MODE_STORY.png'})
FROSTFALL_OCR_PT = Button(area={'cn': (1181, 641, 1254, 663), 'en': (1181, 641, 1254, 663), 'jp': (1181, 641, 1254, 663), 'tw': (1181, 641, 1254, 663)}, color={'cn': (93, 100, 106), 'en': (93, 100, 106), 'jp': (93, 100, 106), 'tw': (93, 100, 106)}, button={'cn': (1181, 641, 1254, 663), 'en': (1181, 641, 1254, 663), 'jp': (1181, 641, 1254, 663), 'tw': (1181, 641, 1254, 663)}, file={'cn': './assets/cn/coalition/FROSTFALL_OCR_PT.png', 'en': './assets/en/coalition/FROSTFALL_OCR_PT.png', 'jp': './assets/jp/coalition/FROSTFALL_OCR_PT.png', 'tw': './assets/tw/coalition/FROSTFALL_OCR_PT.png'})
FROSTFALL_SP = Button(area={'cn': (631, 160, 658, 173), 'en': (631, 160, 658, 173), 'jp': (631, 160, 658, 173), 'tw': (505, 290, 532, 302)}, color={'cn': (194, 145, 252), 'en': (194, 145, 252), 'jp': (194, 145, 252), 'tw': (183, 128, 253)}, button={'cn': (631, 160, 658, 173), 'en': (631, 160, 658, 173), 'jp': (631, 160, 658, 173), 'tw': (505, 290, 532, 302)}, file={'cn': './assets/cn/coalition/FROSTFALL_SP.png', 'en': './assets/en/coalition/FROSTFALL_SP.png', 'jp': './assets/jp/coalition/FROSTFALL_SP.png', 'tw': './assets/tw/coalition/FROSTFALL_SP.png'})
FROSTFALL_SWITCH_MULTI = Button(area={'cn': (1106, 449, 1237, 478), 'en': (1106, 449, 1237, 478), 'jp': (1106, 449, 1237, 478), 'tw': (1106, 449, 1237, 478)}, color={'cn': (232, 175, 58), 'en': (232, 175, 58), 'jp': (232, 175, 58), 'tw': (232, 175, 58)}, button={'cn': (1106, 449, 1237, 478), 'en': (1106, 449, 1237, 478), 'jp': (1106, 449, 1237, 478), 'tw': (1106, 449, 1237, 478)}, file={'cn': './assets/cn/coalition/FROSTFALL_SWITCH_MULTI.png', 'en': './assets/cn/coalition/FROSTFALL_SWITCH_MULTI.png', 'jp': './assets/cn/coalition/FROSTFALL_SWITCH_MULTI.png', 'tw': './assets/cn/coalition/FROSTFALL_SWITCH_MULTI.png'})
FROSTFALL_SWITCH_SINGLE = Button(area={'cn': (968, 449, 1098, 478), 'en': (968, 449, 1098, 478), 'jp': (968, 449, 1098, 478), 'tw': (968, 449, 1098, 478)}, color={'cn': (230, 173, 57), 'en': (230, 173, 57), 'jp': (230, 173, 57), 'tw': (230, 173, 57)}, button={'cn': (968, 449, 1098, 478), 'en': (968, 449, 1098, 478), 'jp': (968, 449, 1098, 478), 'tw': (968, 449, 1098, 478)}, file={'cn': './assets/cn/coalition/FROSTFALL_SWITCH_SINGLE.png', 'en': './assets/cn/coalition/FROSTFALL_SWITCH_SINGLE.png', 'jp': './assets/cn/coalition/FROSTFALL_SWITCH_SINGLE.png', 'tw': './assets/cn/coalition/FROSTFALL_SWITCH_SINGLE.png'})
FROSTFALL_TC1 = Button(area={'cn': (304, 320, 330, 332), 'en': (304, 320, 330, 332), 'jp': (304, 320, 330, 332), 'tw': (304, 320, 330, 332)}, color={'cn': (204, 162, 254), 'en': (204, 162, 254), 'jp': (204, 162, 254), 'tw': (188, 137, 254)}, button={'cn': (304, 320, 330, 332), 'en': (304, 320, 330, 332), 'jp': (304, 320, 330, 332), 'tw': (304, 320, 330, 332)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC1.png', 'en': './assets/en/coalition/FROSTFALL_TC1.png', 'jp': './assets/jp/coalition/FROSTFALL_TC1.png', 'tw': './assets/tw/coalition/FROSTFALL_TC1.png'})
FROSTFALL_TC2 = Button(area={'cn': (810, 362, 835, 373), 'en': (810, 362, 835, 373), 'jp': (810, 362, 835, 373), 'tw': (631, 160, 658, 173)}, color={'cn': (214, 178, 254), 'en': (214, 178, 254), 'jp': (214, 178, 254), 'tw': (186, 136, 252)}, button={'cn': (810, 362, 835, 373), 'en': (810, 362, 835, 373), 'jp': (810, 362, 835, 373), 'tw': (631, 160, 658, 173)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC2.png', 'en': './assets/en/coalition/FROSTFALL_TC2.png', 'jp': './assets/jp/coalition/FROSTFALL_TC2.png', 'tw': './assets/tw/coalition/FROSTFALL_TC2.png'})
FROSTFALL_TC3 = Button(area={'cn': (505, 290, 532, 302), 'en': (505, 290, 532, 302), 'jp': (505, 290, 532, 302), 'tw': (810, 362, 835, 373)}, color={'cn': (210, 172, 252), 'en': (210, 172, 252), 'jp': (210, 172, 252), 'tw': (197, 153, 255)}, button={'cn': (505, 290, 532, 302), 'en': (505, 290, 532, 302), 'jp': (505, 290, 532, 302), 'tw': (810, 362, 835, 373)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC3.png', 'en': './assets/en/coalition/FROSTFALL_TC3.png', 'jp': './assets/jp/coalition/FROSTFALL_TC3.png', 'tw': './assets/tw/coalition/FROSTFALL_TC3.png'})
MODE_SWITCH_BATTLE = Button(area={'cn': (71, 608, 137, 653), 'en': (71, 608, 137, 653), 'jp': (71, 608, 137, 653), 'tw': (71, 608, 137, 653)}, color={'cn': (63, 106, 122), 'en': (63, 106, 122), 'jp': (63, 106, 122), 'tw': (63, 106, 122)}, button={'cn': (71, 608, 137, 653), 'en': (71, 608, 137, 653), 'jp': (71, 608, 137, 653), 'tw': (71, 608, 137, 653)}, file={'cn': './assets/cn/coalition/MODE_SWITCH_BATTLE.png', 'en': './assets/en/coalition/MODE_SWITCH_BATTLE.png', 'jp': './assets/jp/coalition/MODE_SWITCH_BATTLE.png', 'tw': './assets/tw/coalition/MODE_SWITCH_BATTLE.png'})
MODE_SWITCH_STORY = Button(area={'cn': (73, 610, 134, 652), 'en': (73, 610, 134, 652), 'jp': (73, 610, 134, 652), 'tw': (73, 610, 134, 652)}, color={'cn': (119, 44, 32), 'en': (119, 44, 32), 'jp': (119, 44, 32), 'tw': (119, 44, 32)}, button={'cn': (73, 610, 134, 652), 'en': (73, 610, 134, 652), 'jp': (73, 610, 134, 652), 'tw': (73, 610, 134, 652)}, file={'cn': './assets/cn/coalition/MODE_SWITCH_STORY.png', 'en': './assets/en/coalition/MODE_SWITCH_STORY.png', 'jp': './assets/jp/coalition/MODE_SWITCH_STORY.png', 'tw': './assets/tw/coalition/MODE_SWITCH_STORY.png'})

View File

@ -7,7 +7,20 @@ from module.exception import ScriptError, ScriptEnd
from module.logger import logger
from module.ocr.ocr import Digit
OCR_PT = Digit(FROSTFALL_OCR_PT, name='OCR_PT', letter=(198, 158, 82), threshold=128)
class AcademyPtOcr(Digit):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.alphabet += ':'
def after_process(self, result):
logger.attr(self.name, result)
try:
# 累计: 840
result = result.rsplit(':')[1]
except IndexError:
pass
return super().after_process(result)
class Coalition(CoalitionCombat, CampaignEvent):
@ -19,10 +32,19 @@ class Coalition(CoalitionCombat, CampaignEvent):
Returns:
int: PT amount, or 0 if unable to parse
"""
pt = OCR_PT.ocr(self.device.image)
event = self.config.Campaign_Event
if event == 'coalition_20230323':
ocr = Digit(FROSTFALL_OCR_PT, name='OCR_PT', letter=(198, 158, 82), threshold=128)
elif event == 'coalition_20240627':
ocr = AcademyPtOcr(ACADEMY_PT_OCR, name='OCR_PT', letter=(255, 255, 255), threshold=128)
else:
logger.error(f'ocr object is not defined in event {event}')
raise ScriptError
pt = ocr.ocr(self.device.image)
return pt
def triggered_stop_condition(self):
def triggered_stop_condition(self, oil_check=True):
"""
Returns:
bool: If triggered a stop condition.
@ -34,10 +56,11 @@ class Coalition(CoalitionCombat, CampaignEvent):
self.config.Scheduler_Enable = False
return True
# Oil limit
if self.get_oil() < max(500, self.config.StopCondition_OilLimit):
logger.hr('Triggered stop condition: Oil limit')
self.config.task_delay(minute=(120, 240))
return True
if oil_check:
if self.get_oil() < max(500, self.config.StopCondition_OilLimit):
logger.hr('Triggered stop condition: Oil limit')
self.config.task_delay(minute=(120, 240))
return True
# Event limit
if self.event_pt_limit_triggered():
logger.hr('Triggered stop condition: Event PT limit')
@ -76,9 +99,11 @@ class Coalition(CoalitionCombat, CampaignEvent):
self.config.override(
Coalition_Fleet='multi',
)
self.emotion.check_reduce(battle=self.coalition_get_battles(stage))
self.emotion.check_reduce(battle=self.coalition_get_battles(event, stage))
self.enter_map(stage=stage, fleet=fleet)
self.enter_map(event=event, stage=stage, mode=fleet)
if self.triggered_stop_condition(oil_check=True):
raise ScriptEnd
self.coalition_combat()
@staticmethod
@ -89,14 +114,14 @@ class Coalition(CoalitionCombat, CampaignEvent):
return event, stage
def run(self, name='', stage='', fleet='', total=0):
name = name if name else self.config.Campaign_Event
stage = stage if stage else self.config.Campaign_Name
def run(self, event='', stage='', fleet='', total=0):
event = event if event else self.config.Campaign_Event
stage = stage if stage else self.config.Coalition_Mode
fleet = fleet if fleet else self.config.Coalition_Fleet
if not name or not stage or not fleet:
raise ScriptError(f'RaidRun arguments unfilled. name={name}, stage={stage}, fleet={fleet}')
if not event or not stage or not fleet:
raise ScriptError(f'RaidRun arguments unfilled. name={event}, stage={stage}, fleet={fleet}')
name, stage = self.handle_stage_name(name, stage)
event, stage = self.handle_stage_name(event, stage)
self.run_count = 0
self.run_limit = self.config.StopCondition_RunCount
while 1:
@ -107,7 +132,7 @@ class Coalition(CoalitionCombat, CampaignEvent):
self.config.task_stop()
# Log
logger.hr(f'{name}_{stage}', level=2)
logger.hr(f'{event}_{stage}', level=2)
if self.config.StopCondition_RunCount > 0:
logger.info(f'Count remain: {self.config.StopCondition_RunCount}')
else:
@ -117,17 +142,17 @@ class Coalition(CoalitionCombat, CampaignEvent):
self.device.stuck_record_clear()
self.device.click_record_clear()
self.ui_goto_coalition()
self.coalition_ensure_mode('battle')
self.coalition_ensure_mode(event, 'battle')
# End
if self.triggered_stop_condition():
if self.triggered_stop_condition(oil_check=False):
break
# Run
self.device.stuck_record_clear()
self.device.click_record_clear()
try:
self.coalition_execute_once(event=name, stage=stage, fleet=fleet)
self.coalition_execute_once(event=event, stage=stage, fleet=fleet)
except ScriptEnd as e:
logger.hr('Script end')
logger.info(str(e))
@ -138,7 +163,7 @@ class Coalition(CoalitionCombat, CampaignEvent):
if self.config.StopCondition_RunCount:
self.config.StopCondition_RunCount -= 1
# End
if self.triggered_stop_condition():
if self.triggered_stop_condition(oil_check=False):
break
# Scheduler
if self.config.task_switched():

View File

@ -2,33 +2,38 @@ from module.base.timer import Timer
from module.coalition.assets import *
from module.combat.assets import BATTLE_PREPARATION
from module.combat.combat import Combat
from module.exception import CampaignNameError, RequestHumanTakeover
from module.exception import CampaignNameError, RequestHumanTakeover, ScriptError
from module.logger import logger
from module.ui.assets import COALITION_CHECK
from module.ui.page import page_coalition
from module.ui.switch import Switch
MODE_SWITCH = Switch('CoalitionMode', offset=(20, 20))
MODE_SWITCH.add_status('story', MODE_SWITCH_STORY)
MODE_SWITCH.add_status('battle', MODE_SWITCH_BATTLE)
FLEET_SWITCH = Switch('FleetMode', is_selector=True, offset=0) # No offset for color match
FLEET_SWITCH.add_status('single', FLEET_SWITCH_SINGLE)
FLEET_SWITCH.add_status('multi', FLEET_SWITCH_MULTI)
class CoalitionUI(Combat):
def in_coalition(self):
# The same as raid
return self.appear(COALITION_CHECK, offset=(20, 20))
return self.ui_page_appear(page_coalition, offset=(20, 20))
def coalition_ensure_mode(self, mode):
def coalition_ensure_mode(self, event, mode):
"""
Args:
event (str): Event name.
mode (str): 'story' or 'battle'
Pages:
in: in_coalition
"""
MODE_SWITCH = Switch('CoalitionMode', offset=(20, 20))
if event == 'coalition_20230323':
MODE_SWITCH.add_status('story', FROSTFALL_MODE_STORY)
MODE_SWITCH.add_status('battle', FROSTFALL_MODE_BATTLE)
elif event == 'coalition_20240627':
# Note that switch button are reversed
MODE_SWITCH.add_status('story', ACADEMY_MODE_BATTLE)
MODE_SWITCH.add_status('battle', ACADEMY_MODE_STORY)
else:
logger.error(f'MODE_SWITCH is not defined in event {event}')
raise ScriptError
if mode == 'story':
MODE_SWITCH.set('battle', main=self)
elif mode == 'battle':
@ -36,14 +41,26 @@ class CoalitionUI(Combat):
else:
logger.warning(f'Unknown coalition campaign mode: {mode}')
def coalition_ensure_fleet(self, mode):
def coalition_ensure_fleet(self, event, mode):
"""
Args:
event (str): Event name.
mode (str): 'single' or 'multi'
Pages:
in: FLEET_PREPARATION
"""
FLEET_SWITCH = Switch('FleetMode', is_selector=True, offset=0) # No offset for color match
if event == 'coalition_20230323':
FLEET_SWITCH.add_status('single', FROSTFALL_SWITCH_SINGLE)
FLEET_SWITCH.add_status('multi', FROSTFALL_SWITCH_MULTI)
elif event == 'coalition_20240627':
FLEET_SWITCH.add_status('single', ACADEMY_SWITCH_SINGLE)
FLEET_SWITCH.add_status('multi', ACADEMY_SWITCH_MULTI)
else:
logger.error(f'FLEET_SWITCH is not defined in event {event}')
raise ScriptError
if mode == 'single':
FLEET_SWITCH.set('single', main=self)
elif mode == 'multi':
@ -52,68 +69,119 @@ class CoalitionUI(Combat):
logger.warning(f'Unknown coalition fleet mode: {mode}')
@staticmethod
def coalition_get_entrance(stage):
def coalition_get_entrance(event, stage):
"""
Args:
event (str): Event name.
stage (str): Stage name.
Returns:
Button: Entrance button
"""
stage = stage.lower()
if stage == 'tc1':
return FROSTFALL_TC1
if stage == 'tc2':
return FROSTFALL_TC2
if stage == 'tc3':
return FROSTFALL_TC3
if stage == 'sp':
return FROSTFALL_SP
if stage == 'ex':
return FROSTFALL_EX
dic = {
('coalition_20230323', 'tc1'): FROSTFALL_TC1,
('coalition_20230323', 'tc2'): FROSTFALL_TC2,
('coalition_20230323', 'tc3'): FROSTFALL_TC3,
('coalition_20230323', 'sp'): FROSTFALL_SP,
('coalition_20230323', 'ex'): FROSTFALL_EX,
raise CampaignNameError
('coalition_20240627', 'easy'): ACADEMY_EASY,
('coalition_20240627', 'normal'): ACADEMY_NORMAL,
('coalition_20240627', 'hard'): ACADEMY_HARD,
('coalition_20240627', 'sp'): ACADEMY_SP,
('coalition_20240627', 'ex'): ACADEMY_EX,
}
stage = stage.lower()
try:
return dic[(event, stage)]
except KeyError as e:
logger.error(e)
raise CampaignNameError
@staticmethod
def coalition_get_battles(stage):
def coalition_get_battles(event, stage):
"""
Args:
event (str): Event name.
stage (str): Stage name.
Returns:
int: Number of battles
"""
if stage == 'tc1':
return 1
if stage == 'tc2':
return 2
if stage == 'tc3':
return 3
dic = {
('coalition_20230323', 'tc1'): 1,
('coalition_20230323', 'tc2'): 2,
('coalition_20230323', 'tc3'): 3,
('coalition_20230323', 'sp'): 1,
('coalition_20230323', 'ex'): 1,
return 1
def handle_fleet_preparation(self, stage, fleet):
('coalition_20240627', 'easy'): 1,
('coalition_20240627', 'normal'): 2,
('coalition_20240627', 'hard'): 3,
('coalition_20240627', 'sp'): 4,
('coalition_20240627', 'ex'): 5,
}
stage = stage.lower()
try:
return dic[(event, stage)]
except KeyError as e:
logger.error(e)
raise CampaignNameError
# No fleet switch in TC1
if stage in ['tc1', 'sp']:
return False
self.coalition_ensure_fleet(fleet)
return True
def enter_map(self, stage, fleet, skip_first_screenshot=True):
@staticmethod
def coalition_get_fleet_preparation(event):
"""
Args:
event (str): Event name.
Returns:
Button:
"""
if event == 'coalition_20230323':
return FROSTFALL_FLEET_PREPARATION
elif event == 'coalition_20240627':
return ACEDEMY_FLEET_PREPARATION
else:
logger.error(f'FLEET_PREPARATION is not defined in event {event}')
raise ScriptError
def handle_fleet_preparation(self, event, stage, mode):
"""
Args:
event (str): Event name.
stage (str): Stage name.
mode (str): 'single' or 'multi'
Returns:
bool: If success
"""
stage = stage.lower()
if event == 'coalition_20230323':
# No fleet switch in TC1
if stage in ['tc1', 'sp']:
return False
if event == 'coalition_20240627':
if stage in ['sp', 'ex']:
return False
self.coalition_ensure_fleet(event, mode)
return True
def enter_map(self, event, stage, mode, skip_first_screenshot=True):
"""
Args:
event (str): Event name such as 'coalition_20230323'
stage (str): Stage name such as 'TC3'
fleet (str): 'single' or 'multi'
mode (str): 'single' or 'multi'
skip_first_screenshot:
Pages:
in: in_coalition
out: BATTLE_PREPARATION
"""
button = self.coalition_get_entrance(stage)
button = self.coalition_get_entrance(event, stage)
fleet_preparation = self.coalition_get_fleet_preparation(event)
campaign_timer = Timer(5)
fleet_timer = Timer(5)
campaign_click = 0
@ -154,9 +222,9 @@ class CoalitionUI(Combat):
continue
# Fleet preparation
if fleet_timer.reached() and self.appear(FLEET_PREPARATION, offset=(20, 50)):
self.handle_fleet_preparation(stage, fleet)
self.device.click(FLEET_PREPARATION)
if fleet_timer.reached() and self.appear(fleet_preparation, offset=(20, 50)):
self.handle_fleet_preparation(event, stage, mode)
self.device.click(fleet_preparation)
fleet_click += 1
fleet_timer.reset()
campaign_timer.reset()

View File

@ -3111,7 +3111,8 @@
"Campaign": {
"Name": {
"type": "input",
"value": "12-4"
"value": "dynamic",
"display": "hide"
},
"Event": {
"type": "state",
@ -3165,6 +3166,16 @@
}
},
"Coalition": {
"Mode": {
"type": "select",
"value": "hard",
"option": [
"easy",
"normal",
"hard",
"ex"
]
},
"Fleet": {
"type": "select",
"value": "single",
@ -6420,6 +6431,16 @@
}
},
"Coalition": {
"Mode": {
"type": "select",
"value": "hard",
"option": [
"easy",
"normal",
"hard",
"ex"
]
},
"Fleet": {
"type": "select",
"value": "single",

View File

@ -305,6 +305,9 @@ RaidDaily:
MaritimeEscort:
Enable: true
Coalition:
Mode:
value: hard
option: [ easy, normal, hard, ex ]
Fleet:
value: single
option: [ single, multi ]

View File

@ -215,6 +215,7 @@ Coalition:
Campaign:
Event:
type: state
Name: dynamic
Mode: normal
UseClearMode: true
UseFleetLock: true

View File

@ -178,6 +178,7 @@ class GeneratedConfig:
MaritimeEscort_Enable = True
# Group `Coalition`
Coalition_Mode = 'hard' # easy, normal, hard, ex
Coalition_Fleet = 'single' # single, multi
# Group `Commission`

View File

@ -115,7 +115,7 @@
"help": ""
},
"CoalitionSp": {
"name": "Frostfall Daily SP",
"name": "Little Academy SP",
"help": ""
},
"Commission": {
@ -1258,6 +1258,14 @@
"name": "Event Settings",
"help": "Fleets must be prepared manually in game before running"
},
"Mode": {
"name": "Mode",
"help": "SP needs to use event daily SP to run",
"easy": "Easy",
"normal": "Normal",
"hard": "Hard",
"ex": "EX"
},
"Fleet": {
"name": "Fleet",
"help": "",

View File

@ -1258,6 +1258,14 @@
"name": "Coalition._info.name",
"help": "Coalition._info.help"
},
"Mode": {
"name": "Coalition.Mode.name",
"help": "Coalition.Mode.help",
"easy": "easy",
"normal": "normal",
"hard": "hard",
"ex": "ex"
},
"Fleet": {
"name": "Coalition.Fleet.name",
"help": "Coalition.Fleet.help",

View File

@ -115,7 +115,7 @@
"help": ""
},
"CoalitionSp": {
"name": "极地风暴每日SP",
"name": "童心学院每日SP",
"help": ""
},
"Commission": {
@ -1258,6 +1258,14 @@
"name": "活动设置",
"help": "出击前必须在游戏内手动配队"
},
"Mode": {
"name": "难度",
"help": "SP图需要使用活动每日SP运行",
"easy": "简单",
"normal": "普通",
"hard": "困难",
"ex": "EX"
},
"Fleet": {
"name": "出击队伍",
"help": "",

View File

@ -1258,6 +1258,14 @@
"name": "活動設定",
"help": "出擊前必須在遊戲內手動配隊"
},
"Mode": {
"name": "難度",
"help": "SP圖需要使用活動每日SP運行",
"easy": "簡單",
"normal": "普通",
"hard": "困難",
"ex": "EX"
},
"Fleet": {
"name": "出擊隊伍",
"help": "",

View File

@ -1,7 +1,6 @@
from module.base.button import Button
from module.base.decorator import run_once
from module.base.timer import Timer
from module.coalition.assets import FLEET_PREPARATION as COALITION_FLEET_PREPARATION
from module.combat.assets import GET_ITEMS_1, GET_ITEMS_2, GET_SHIP
from module.exception import (GameNotRunningError, GamePageUnknownError,
RequestHumanTakeover)
@ -19,7 +18,7 @@ from module.ocr.ocr import Ocr
from module.os_handler.assets import (AUTO_SEARCH_REWARD, EXCHANGE_CHECK, RESET_FLEET_PREPARATION, RESET_TICKET_POPUP)
from module.raid.assets import *
from module.ui.assets import *
from module.ui.page import (Page, page_campaign, page_event, page_main, page_sp, page_main_white)
from module.ui.page import (Page, page_campaign, page_event, page_main, page_main_white, page_sp)
from module.ui_white.assets import *
@ -495,8 +494,7 @@ class UI(InfoHandler):
# Campaign preparation
if self.appear(MAP_PREPARATION, offset=(30, 30), interval=3) \
or self.appear(FLEET_PREPARATION, offset=(20, 50), interval=3) \
or self.appear(RAID_FLEET_PREPARATION, offset=(30, 30), interval=3) \
or self.appear(COALITION_FLEET_PREPARATION, offset=(30, 30), interval=3):
or self.appear(RAID_FLEET_PREPARATION, offset=(30, 30), interval=3):
self.device.click(MAP_PREPARATION_CANCEL)
return True
if self.appear_then_click(AUTO_SEARCH_MENU_EXIT, offset=(200, 30), interval=3):