Merge branch 'LmeSzinc:master' into master

This commit is contained in:
PizzaG0d 2023-09-24 21:48:19 +02:00 committed by GitHub
commit 8ee2083a01
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 435 additions and 52 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -129,6 +129,18 @@
"Assignment": {} "Assignment": {}
} }
}, },
"DataUpdate": {
"Scheduler": {
"Enable": true,
"NextRun": "2020-01-01 00:00:00",
"Command": "DataUpdate",
"ServerUpdate": "04:00"
},
"ItemStorage": {
"Credit": {},
"StallerJade": {}
}
},
"Rogue": { "Rogue": {
"Scheduler": { "Scheduler": {
"Enable": false, "Enable": false,

View File

@ -265,8 +265,9 @@ class KeywordExtract:
def generate_map_planes(self): def generate_map_planes(self):
planes = { planes = {
'Herta': ['黑塔的办公室', 'Special': ['黑塔的办公室', '锋芒崭露'],
'观景车厢', '主控舱段', '基座舱段', '收容舱段', '支援舱段'], 'Rogue': [ '区域-战斗', '区域-事件', '区域-遭遇', '区域-休整', '区域-精英', '区域-首领', '区域-交易'],
'Herta': ['观景车厢', '主控舱段', '基座舱段', '收容舱段', '支援舱段'],
'Jarilo': ['行政区', '城郊雪原', '边缘通路', '铁卫禁区', '残响回廊', '永冬岭', 'Jarilo': ['行政区', '城郊雪原', '边缘通路', '铁卫禁区', '残响回廊', '永冬岭',
'磐岩镇', '大矿区', '铆钉镇', '机械聚落'], '磐岩镇', '大矿区', '铆钉镇', '机械聚落'],
'Luofu': ['星槎海中枢', '流云渡', '迴星港', '长乐天', '金人巷', '太卜司', '工造司', '丹鼎司', '鳞渊境'], 'Luofu': ['星槎海中枢', '流云渡', '迴星港', '长乐天', '金人巷', '太卜司', '工造司', '丹鼎司', '鳞渊境'],

View File

@ -75,6 +75,8 @@ class RouteExtract:
gen.Import(""" gen.Import("""
from tasks.map.route.base import RouteData from tasks.map.route.base import RouteData
""") """)
gen.CommentAutoGenerage('dev_tools.route_extract')
for f in self.iter_files(): for f in self.iter_files():
for row in self.extract_route(f): for row in self.extract_route(f):
with gen.Object(key=row.name, object_class='RouteData'): with gen.Object(key=row.name, object_class='RouteData'):

View File

@ -997,6 +997,53 @@
} }
} }
}, },
"DataUpdate": {
"Scheduler": {
"Enable": {
"type": "state",
"value": true,
"option": [
true
],
"option_bold": [
true
]
},
"NextRun": {
"type": "datetime",
"value": "2020-01-01 00:00:00",
"validate": "datetime"
},
"Command": {
"type": "input",
"value": "DataUpdate",
"display": "hide"
},
"ServerUpdate": {
"type": "input",
"value": "04:00",
"display": "hide"
}
},
"ItemStorage": {
"Credit": {
"type": "stored",
"value": {},
"display": "hide",
"stored": "StoredInt",
"order": 7,
"color": "#ab7cf2"
},
"StallerJade": {
"type": "stored",
"value": {},
"display": "hide",
"stored": "StoredInt",
"order": 8,
"color": "#fc8f8b"
}
}
},
"Rogue": { "Rogue": {
"Scheduler": { "Scheduler": {
"Enable": { "Enable": {

View File

@ -168,6 +168,16 @@ Assignment:
order: 3 order: 3
color: "#79dbc4" color: "#79dbc4"
ItemStorage:
Credit:
stored: StoredInt
order: 7
color: "#ab7cf2"
StallerJade:
stored: StoredInt
order: 8
color: "#fc8f8b"
# ==================== Rogue ==================== # ==================== Rogue ====================
RoguePath: RoguePath:

View File

@ -14,7 +14,8 @@
"Dungeon", "Dungeon",
"DailyQuest", "DailyQuest",
"BattlePass", "BattlePass",
"Assignment" "Assignment",
"DataUpdate"
] ]
} }
} }

View File

@ -21,10 +21,12 @@ Restart:
option_bold: [ true, ] option_bold: [ true, ]
ServerUpdate: 04:00 ServerUpdate: 04:00
# ==================== Farm ====================
# ==================== Daily ==================== # ==================== Daily ====================
DataUpdate:
# ==================== Tools ==================== Scheduler:
Enable:
type: state
value: true
option: [ true, ]
option_bold: [ true, ]

View File

@ -64,6 +64,30 @@
"order": 6, "order": 6,
"color": "#8fb5fe" "color": "#8fb5fe"
}, },
"Credit": {
"name": "Credit",
"path": "DataUpdate.ItemStorage.Credit",
"i18n": "ItemStorage.Credit.name",
"stored": "StoredInt",
"attrs": {
"time": "2020-01-01 00:00:00",
"value": 0
},
"order": 7,
"color": "#ab7cf2"
},
"StallerJade": {
"name": "StallerJade",
"path": "DataUpdate.ItemStorage.StallerJade",
"i18n": "ItemStorage.StallerJade.name",
"stored": "StoredInt",
"attrs": {
"time": "2020-01-01 00:00:00",
"value": 0
},
"order": 8,
"color": "#fc8f8b"
},
"DungeonDouble": { "DungeonDouble": {
"name": "DungeonDouble", "name": "DungeonDouble",
"path": "Dungeon.DungeonStorage.DungeonDouble", "path": "Dungeon.DungeonStorage.DungeonDouble",

View File

@ -38,6 +38,9 @@ Daily:
Assignment: Assignment:
- Scheduler - Scheduler
- Assignment - Assignment
DataUpdate:
- Scheduler
- ItemStorage
# ==================== Rogue ==================== # ==================== Rogue ====================

View File

@ -103,6 +103,10 @@ class GeneratedConfig:
Assignment_Duration = 20 # 4, 8, 12, 20 Assignment_Duration = 20 # 4, 8, 12, 20
Assignment_Assignment = {} Assignment_Assignment = {}
# Group `ItemStorage`
ItemStorage_Credit = {}
ItemStorage_StallerJade = {}
# Group `RoguePath` # Group `RoguePath`
RoguePath_Path = 'The_Hunt' # Preservation, Remembrance, Nihility, Abundance, The_Hunt, Destruction, Elation RoguePath_Path = 'The_Hunt' # Preservation, Remembrance, Nihility, Abundance, The_Hunt, Destruction, Elation
RoguePath_Bonus = 'Blessing Cosmos' # Blessing Cosmos, Miracle Cosmos, Fragmented Cosmos RoguePath_Bonus = 'Blessing Cosmos' # Blessing Cosmos, Miracle Cosmos, Fragmented Cosmos

View File

@ -10,7 +10,8 @@ class ManualConfig:
SCHEDULER_PRIORITY = """ SCHEDULER_PRIORITY = """
Restart Restart
> BattlePass > DailyQuest > Assignment > Dungeon > BattlePass > DailyQuest > Assignment > DataUpdate
> Dungeon
""" """
""" """

View File

@ -38,6 +38,10 @@
"name": "Assignment", "name": "Assignment",
"help": "" "help": ""
}, },
"DataUpdate": {
"name": "Dashboard Upd",
"help": ""
},
"Rogue": { "Rogue": {
"name": "Simulated Universe", "name": "Simulated Universe",
"help": "Simulated Universe is in development, task will not be run" "help": "Simulated Universe is in development, task will not be run"
@ -694,7 +698,21 @@
"20": "20 Hours" "20": "20 Hours"
}, },
"Assignment": { "Assignment": {
"name": "Assignment", "name": "Assign.",
"help": ""
}
},
"ItemStorage": {
"_info": {
"name": "ItemStorage._info.name",
"help": "ItemStorage._info.help"
},
"Credit": {
"name": "Credit",
"help": ""
},
"StallerJade": {
"name": "Jade",
"help": "" "help": ""
} }
}, },

View File

@ -38,6 +38,10 @@
"name": "依頼設定", "name": "依頼設定",
"help": "" "help": ""
}, },
"DataUpdate": {
"name": "Task.DataUpdate.name",
"help": "Task.DataUpdate.help"
},
"Rogue": { "Rogue": {
"name": "Task.Rogue.name", "name": "Task.Rogue.name",
"help": "Task.Rogue.help" "help": "Task.Rogue.help"
@ -698,6 +702,20 @@
"help": "Assignment.Assignment.help" "help": "Assignment.Assignment.help"
} }
}, },
"ItemStorage": {
"_info": {
"name": "ItemStorage._info.name",
"help": "ItemStorage._info.help"
},
"Credit": {
"name": "ItemStorage.Credit.name",
"help": "ItemStorage.Credit.help"
},
"StallerJade": {
"name": "ItemStorage.StallerJade.name",
"help": "ItemStorage.StallerJade.help"
}
},
"RoguePath": { "RoguePath": {
"_info": { "_info": {
"name": "RoguePath._info.name", "name": "RoguePath._info.name",

View File

@ -38,6 +38,10 @@
"name": "委托", "name": "委托",
"help": "" "help": ""
}, },
"DataUpdate": {
"name": "仪表盘更新",
"help": ""
},
"Rogue": { "Rogue": {
"name": "模拟宇宙", "name": "模拟宇宙",
"help": "模拟宇宙还在开发中,任务不会被运行" "help": "模拟宇宙还在开发中,任务不会被运行"
@ -698,6 +702,20 @@
"help": "" "help": ""
} }
}, },
"ItemStorage": {
"_info": {
"name": "ItemStorage._info.name",
"help": "ItemStorage._info.help"
},
"Credit": {
"name": "信用点",
"help": ""
},
"StallerJade": {
"name": "星琼",
"help": ""
}
},
"RoguePath": { "RoguePath": {
"_info": { "_info": {
"name": "命途设置", "name": "命途设置",

View File

@ -38,6 +38,10 @@
"name": "委託", "name": "委託",
"help": "" "help": ""
}, },
"DataUpdate": {
"name": "儀表板更新",
"help": ""
},
"Rogue": { "Rogue": {
"name": "模擬宇宙", "name": "模擬宇宙",
"help": "模擬宇宙還在開發中,任務不會被運行" "help": "模擬宇宙還在開發中,任務不會被運行"
@ -698,6 +702,20 @@
"help": "" "help": ""
} }
}, },
"ItemStorage": {
"_info": {
"name": "ItemStorage._info.name",
"help": "ItemStorage._info.help"
},
"Credit": {
"name": "信用點",
"help": ""
},
"StallerJade": {
"name": "星瓊",
"help": ""
}
},
"RoguePath": { "RoguePath": {
"_info": { "_info": {
"name": "命途設定", "name": "命途設定",

View File

@ -26,3 +26,5 @@ class StoredGenerated:
BattlePassLevel = StoredBattlePassLevel("BattlePass.BattlePassStorage.BattlePassLevel") BattlePassLevel = StoredBattlePassLevel("BattlePass.BattlePassStorage.BattlePassLevel")
BattlePassTodayQuest = StoredBattlePassTodayQuest("BattlePass.BattlePassStorage.BattlePassTodayQuest") BattlePassTodayQuest = StoredBattlePassTodayQuest("BattlePass.BattlePassStorage.BattlePassTodayQuest")
Assignment = StoredAssignment("Assignment.Assignment.Assignment") Assignment = StoredAssignment("Assignment.Assignment.Assignment")
Credit = StoredInt("DataUpdate.ItemStorage.Credit")
StallerJade = StoredInt("DataUpdate.ItemStorage.StallerJade")

View File

@ -415,9 +415,10 @@ class AlasGUI(Frame):
put_html('<hr class="hr-group">'), put_html('<hr class="hr-group">'),
put_scope("dashboard", [ put_scope("dashboard", [
# Empty dashboard, values will be updated in alas_update_overview_task() # Empty dashboard, values will be updated in alas_update_overview_task()
put_scope(f"dashboard-row-{arg}", []) for arg in self.ALAS_STORED.keys() put_scope(f"dashboard-row-{arg}", [])
for arg in self.ALAS_STORED.keys() if deep_get(self.ALAS_STORED, keys=[arg, "order"], default=0)
# Empty content to left-align last row # Empty content to left-align last row
] + [put_html("<i></i>")] * len(self.ALAS_STORED)) ] + [put_html("<i></i>")] * min(len(self.ALAS_STORED), 4))
]) ])
put_scope("log", [put_html("")]) put_scope("log", [put_html("")])

4
src.py
View File

@ -38,6 +38,10 @@ class StarRailCopilot(AzurLaneAutoScript):
from tasks.assignment.assignment import Assignment from tasks.assignment.assignment import Assignment
Assignment(config=self.config, device=self.device).run() Assignment(config=self.config, device=self.device).run()
def data_update(self):
from tasks.item.data_update import DataUpdate
DataUpdate(config=self.config, device=self.device).run()
if __name__ == '__main__': if __name__ == '__main__':
src = StarRailCopilot('src') src = StarRailCopilot('src')

View File

@ -13,3 +13,13 @@ OCR_MAP_NAME = ButtonWrapper(
button=(48, 15, 373, 32), button=(48, 15, 373, 32),
), ),
) )
ROGUE_LEAVE_FOR_NOW = ButtonWrapper(
name='ROGUE_LEAVE_FOR_NOW',
share=Button(
file='./assets/share/base/main_page/ROGUE_LEAVE_FOR_NOW.png',
area=(729, 475, 765, 519),
search=(709, 455, 785, 539),
color=(82, 74, 59),
button=(729, 475, 765, 519),
),
)

View File

@ -2,13 +2,15 @@ import re
from typing import Optional from typing import Optional
import module.config.server as server import module.config.server as server
from module.base.base import ModuleBase
from module.config.server import VALID_LANG from module.config.server import VALID_LANG
from module.exception import RequestHumanTakeover, ScriptError from module.exception import RequestHumanTakeover, ScriptError
from module.logger import logger from module.logger import logger
from module.ocr.ocr import Ocr from module.ocr.ocr import Ocr
from tasks.base.assets.assets_base_main_page import OCR_MAP_NAME from tasks.base.assets.assets_base_main_page import OCR_MAP_NAME, ROGUE_LEAVE_FOR_NOW
from tasks.base.page import Page, page_main from tasks.base.assets.assets_base_page import CLOSE, MAP_EXIT
from tasks.base.page import Page, page_gacha, page_main
from tasks.base.popup import PopupHandler
from tasks.daily.assets.assets_daily_trial import START_TRIAL
from tasks.map.keywords import KEYWORDS_MAP_PLANE, MapPlane from tasks.map.keywords import KEYWORDS_MAP_PLANE, MapPlane
@ -18,10 +20,13 @@ class OcrPlaneName(Ocr):
result = re.sub(r'-[Ii1]$', '', result) result = re.sub(r'-[Ii1]$', '', result)
result = re.sub(r'\d+$', '', result) result = re.sub(r'\d+$', '', result)
# 累塔的办公室
result = result.replace('累塔', '黑塔')
return super().after_process(result) return super().after_process(result)
class MainPage(ModuleBase): class MainPage(PopupHandler):
# Same as BigmapPlane class # Same as BigmapPlane class
# Current plane # Current plane
plane: MapPlane = KEYWORDS_MAP_PLANE.Herta_ParlorCar plane: MapPlane = KEYWORDS_MAP_PLANE.Herta_ParlorCar
@ -93,3 +98,51 @@ class MainPage(ModuleBase):
self.handle_lang_check(page=page_main) self.handle_lang_check(page=page_main)
return True return True
def ui_leave_special(self):
"""
Leave from:
- Rogue domains
- Character trials
Returns:
bool: If left a special plane
Pages:
in: Any
out: page_main
"""
if not self.appear(MAP_EXIT):
return False
logger.info('UI leave special')
skip_first_screenshot = True
clicked = False
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if clicked:
if self.appear(page_main.check_button):
logger.info(f'Leave to {page_main}')
break
if self.appear_then_click(MAP_EXIT, interval=2):
continue
if self.handle_popup_confirm():
continue
if self.match_template_color(START_TRIAL, interval=2):
logger.info(f'{START_TRIAL} -> {CLOSE}')
self.device.click(CLOSE)
clicked = True
continue
if self.appear(page_gacha.check_button, interval=2):
logger.info(f'{page_gacha} -> {CLOSE}')
self.device.click(CLOSE)
continue
if self.appear_then_click(ROGUE_LEAVE_FOR_NOW, interval=2):
clicked = True
continue

View File

@ -7,12 +7,12 @@ from module.ocr.ocr import Ocr
from tasks.base.assets.assets_base_page import CLOSE, MAP_EXIT from tasks.base.assets.assets_base_page import CLOSE, MAP_EXIT
from tasks.base.main_page import MainPage from tasks.base.main_page import MainPage
from tasks.base.page import Page, page_main from tasks.base.page import Page, page_main
from tasks.base.popup import PopupHandler
from tasks.combat.assets.assets_combat_finish import COMBAT_EXIT from tasks.combat.assets.assets_combat_finish import COMBAT_EXIT
from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE
from tasks.daily.assets.assets_daily_trial import INFO_CLOSE
class UI(PopupHandler, MainPage): class UI( MainPage):
ui_current: Page ui_current: Page
ui_main_confirm_timer = Timer(0.2, count=0) ui_main_confirm_timer = Timer(0.2, count=0)
@ -143,10 +143,11 @@ class UI(PopupHandler, MainPage):
# Reset connection # Reset connection
Page.clear_connection() Page.clear_connection()
def ui_ensure(self, destination, skip_first_screenshot=True): def ui_ensure(self, destination, acquire_lang_checked=True, skip_first_screenshot=True):
""" """
Args: Args:
destination (Page): destination (Page):
acquire_lang_checked:
skip_first_screenshot: skip_first_screenshot:
Returns: Returns:
@ -154,8 +155,12 @@ class UI(PopupHandler, MainPage):
""" """
logger.hr("UI ensure") logger.hr("UI ensure")
self.ui_get_current_page(skip_first_screenshot=skip_first_screenshot) self.ui_get_current_page(skip_first_screenshot=skip_first_screenshot)
if self.acquire_lang_checked():
self.ui_get_current_page(skip_first_screenshot=skip_first_screenshot) self.ui_leave_special()
if acquire_lang_checked:
if self.acquire_lang_checked():
self.ui_get_current_page(skip_first_screenshot=skip_first_screenshot)
if self.ui_current == destination: if self.ui_current == destination:
logger.info("Already at %s" % destination) logger.info("Already at %s" % destination)
@ -294,6 +299,8 @@ class UI(PopupHandler, MainPage):
self.device.click(CLOSE) self.device.click(CLOSE)
if self.appear_then_click(COMBAT_EXIT, interval=5): if self.appear_then_click(COMBAT_EXIT, interval=5):
return True return True
if self.appear_then_click(INFO_CLOSE, interval=5):
return True
return False return False

View File

@ -51,6 +51,10 @@ class CombatSkill(UI):
logger.info(f'Skill used: {button}') logger.info(f'Skill used: {button}')
break break
def _is_skill_active(self, button):
flag = self.image_color_count(button, color=(220, 196, 145), threshold=221, count=50)
return flag
def _skill_switch(self, check_button, click_button, skip_first_screenshot=True): def _skill_switch(self, check_button, click_button, skip_first_screenshot=True):
""" """
Switch to A or E Switch to A or E
@ -64,11 +68,11 @@ class CombatSkill(UI):
self.device.screenshot() self.device.screenshot()
# Raw brown border # Raw brown border
if self.image_color_count(check_button, color=(220, 196, 145), threshold=221, count=50): if self._is_skill_active(check_button):
logger.info(f'Skill switched: {check_button}') logger.info(f'Skill switched: {check_button}')
break break
if self.is_in_skill(): if self.is_in_skill() and (self._is_skill_active(CHECK_A) or self._is_skill_active(CHECK_E)):
if interval.reached(): if interval.reached():
self.device.click(click_button) self.device.click(click_button)
interval.reset() interval.reset()

View File

@ -274,9 +274,6 @@ class DailyQuestUI(DungeonUI, RouteLoader):
""" """
enemy = 0 enemy = 0
item = 0 item = 0
quests = [
KEYWORDS_DAILY_QUEST.Enter_combat_by_attacking_enemy_Weakness_and_win_3_times,
]
if KEYWORDS_DAILY_QUEST.In_a_single_battle_inflict_3_Weakness_Break_of_different_Types in quests: if KEYWORDS_DAILY_QUEST.In_a_single_battle_inflict_3_Weakness_Break_of_different_Types in quests:
enemy = max(enemy, 1) enemy = max(enemy, 1)
if KEYWORDS_DAILY_QUEST.Inflict_Weakness_Break_5_times in quests: if KEYWORDS_DAILY_QUEST.Inflict_Weakness_Break_5_times in quests:
@ -327,5 +324,6 @@ class DailyQuestUI(DungeonUI, RouteLoader):
if KEYWORD_BATTLE_PASS_QUEST.Reach_500_on_Daily_Training_Activity in quests: if KEYWORD_BATTLE_PASS_QUEST.Reach_500_on_Daily_Training_Activity in quests:
logger.info('Achieved battle pass quest Reach_500_on_Daily_Training_Activity') logger.info('Achieved battle pass quest Reach_500_on_Daily_Training_Activity')
self.config.task_call('BattlePass') self.config.task_call('BattlePass')
self.config.task_call('DataUpdate')
# Delay self # Delay self
self.config.task_delay(server_update=True) self.config.task_delay(server_update=True)

View File

@ -0,0 +1,15 @@
from module.base.button import Button, ButtonWrapper
# This file was auto-generated, do not modify it manually. To generate:
# ``` python -m dev_tools.button_extract ```
OCR_DATA = ButtonWrapper(
name='OCR_DATA',
share=Button(
file='./assets/share/item/data/OCR_DATA.png',
area=(843, 13, 1152, 61),
search=(823, 0, 1172, 81),
color=(39, 43, 51),
button=(843, 13, 1152, 61),
),
)

44
tasks/item/data_update.py Normal file
View File

@ -0,0 +1,44 @@
from module.base.timer import Timer
from module.logger import logger
from module.ocr.ocr import Digit
from tasks.base.page import page_item
from tasks.base.ui import UI
from tasks.item.assets.assets_item_data import OCR_DATA
class DataUpdate(UI):
def _get_data(self):
"""
Page:
in: page_item
"""
ocr = Digit(OCR_DATA)
timeout = Timer(2, count=6).start()
credit, jade = 0, 0
while 1:
data = ocr.detect_and_ocr(self.device.image)
if len(data) == 2:
credit, jade = [int(d.ocr_text) for d in data]
if credit > 0 or jade > 0:
break
logger.warning(f'Invalid credit and stellar jade: {data}')
if timeout.reached():
logger.warning('Get data timeout')
break
logger.attr('Credit', credit)
logger.attr('StellarJade', jade)
with self.config.multi_set():
self.config.stored.Credit.value = credit
self.config.stored.StallerJade.value = jade
return credit, jade
def run(self):
self.ui_ensure(page_item, acquire_lang_checked=False)
with self.config.multi_set():
self._get_data()
self.config.task_delay(server_update=True)

View File

@ -3,16 +3,80 @@ from .classes import MapPlane
# This file was auto-generated, do not modify it manually. To generate: # This file was auto-generated, do not modify it manually. To generate:
# ``` python -m dev_tools.keyword_extract ``` # ``` python -m dev_tools.keyword_extract ```
Herta_HertaOffice = MapPlane( Special_HertaOffice = MapPlane(
id=1, id=1,
name='Herta_HertaOffice', name='Special_HertaOffice',
cn='黑塔的办公室', cn='黑塔的办公室',
cht='黑塔的辦公室', cht='黑塔的辦公室',
en="Herta's Office", en="Herta's Office",
jp='ヘルタのオフィス', jp='ヘルタのオフィス',
) )
Herta_ParlorCar = MapPlane( Special_AptitudeShowcase = MapPlane(
id=2, id=2,
name='Special_AptitudeShowcase',
cn='锋芒崭露',
cht='鋒芒嶄露',
en='Aptitude Showcase',
jp='躍進する新星',
)
Rogue_DomainCombat = MapPlane(
id=3,
name='Rogue_DomainCombat',
cn='区域-战斗',
cht='區域-戰鬥',
en='Domain — Combat',
jp='エリア-戦闘',
)
Rogue_DomainOccurrence = MapPlane(
id=4,
name='Rogue_DomainOccurrence',
cn='区域-事件',
cht='區域-事件',
en='Domain — Occurrence',
jp='エリア-イベント',
)
Rogue_DomainEncounter = MapPlane(
id=5,
name='Rogue_DomainEncounter',
cn='区域-遭遇',
cht='區域-遭遇',
en='Domain — Encounter',
jp='エリア-遭遇',
)
Rogue_DomainRespite = MapPlane(
id=6,
name='Rogue_DomainRespite',
cn='区域-休整',
cht='區域-整備',
en='Domain — Respite',
jp='エリア-休憩',
)
Rogue_DomainElite = MapPlane(
id=7,
name='Rogue_DomainElite',
cn='区域-精英',
cht='區域-菁英',
en='Domain — Elite',
jp='エリア-精鋭',
)
Rogue_DomainBoss = MapPlane(
id=8,
name='Rogue_DomainBoss',
cn='区域-首领',
cht='區域-頭目',
en='Domain — Boss',
jp='エリア-ボス',
)
Rogue_DomainTransaction = MapPlane(
id=9,
name='Rogue_DomainTransaction',
cn='区域-交易',
cht='區域-交易',
en='Domain — Transaction',
jp='エリア-取引',
)
Herta_ParlorCar = MapPlane(
id=10,
name='Herta_ParlorCar', name='Herta_ParlorCar',
cn='观景车厢', cn='观景车厢',
cht='觀景車廂', cht='觀景車廂',
@ -20,7 +84,7 @@ Herta_ParlorCar = MapPlane(
jp='列車のラウンジ', jp='列車のラウンジ',
) )
Herta_MasterControlZone = MapPlane( Herta_MasterControlZone = MapPlane(
id=3, id=11,
name='Herta_MasterControlZone', name='Herta_MasterControlZone',
cn='主控舱段', cn='主控舱段',
cht='主控艙段', cht='主控艙段',
@ -28,7 +92,7 @@ Herta_MasterControlZone = MapPlane(
jp='主制御部分', jp='主制御部分',
) )
Herta_BaseZone = MapPlane( Herta_BaseZone = MapPlane(
id=4, id=12,
name='Herta_BaseZone', name='Herta_BaseZone',
cn='基座舱段', cn='基座舱段',
cht='基座艙段', cht='基座艙段',
@ -36,7 +100,7 @@ Herta_BaseZone = MapPlane(
jp='ベース部分', jp='ベース部分',
) )
Herta_StorageZone = MapPlane( Herta_StorageZone = MapPlane(
id=5, id=13,
name='Herta_StorageZone', name='Herta_StorageZone',
cn='收容舱段', cn='收容舱段',
cht='收容艙段', cht='收容艙段',
@ -44,7 +108,7 @@ Herta_StorageZone = MapPlane(
jp='収容部分', jp='収容部分',
) )
Herta_SupplyZone = MapPlane( Herta_SupplyZone = MapPlane(
id=6, id=14,
name='Herta_SupplyZone', name='Herta_SupplyZone',
cn='支援舱段', cn='支援舱段',
cht='支援艙段', cht='支援艙段',
@ -52,7 +116,7 @@ Herta_SupplyZone = MapPlane(
jp='サポート部分', jp='サポート部分',
) )
Jarilo_AdministrativeDistrict = MapPlane( Jarilo_AdministrativeDistrict = MapPlane(
id=7, id=15,
name='Jarilo_AdministrativeDistrict', name='Jarilo_AdministrativeDistrict',
cn='行政区', cn='行政区',
cht='行政區', cht='行政區',
@ -60,7 +124,7 @@ Jarilo_AdministrativeDistrict = MapPlane(
jp='行政区', jp='行政区',
) )
Jarilo_OutlyingSnowPlains = MapPlane( Jarilo_OutlyingSnowPlains = MapPlane(
id=8, id=16,
name='Jarilo_OutlyingSnowPlains', name='Jarilo_OutlyingSnowPlains',
cn='城郊雪原', cn='城郊雪原',
cht='城郊雪原', cht='城郊雪原',
@ -68,7 +132,7 @@ Jarilo_OutlyingSnowPlains = MapPlane(
jp='郊外雪原', jp='郊外雪原',
) )
Jarilo_BackwaterPass = MapPlane( Jarilo_BackwaterPass = MapPlane(
id=9, id=17,
name='Jarilo_BackwaterPass', name='Jarilo_BackwaterPass',
cn='边缘通路', cn='边缘通路',
cht='邊緣通道', cht='邊緣通道',
@ -76,7 +140,7 @@ Jarilo_BackwaterPass = MapPlane(
jp='外縁通路', jp='外縁通路',
) )
Jarilo_SilvermaneGuardRestrictedZone = MapPlane( Jarilo_SilvermaneGuardRestrictedZone = MapPlane(
id=10, id=18,
name='Jarilo_SilvermaneGuardRestrictedZone', name='Jarilo_SilvermaneGuardRestrictedZone',
cn='铁卫禁区', cn='铁卫禁区',
cht='鐵衛禁區', cht='鐵衛禁區',
@ -84,7 +148,7 @@ Jarilo_SilvermaneGuardRestrictedZone = MapPlane(
jp='シルバーメイン禁区', jp='シルバーメイン禁区',
) )
Jarilo_CorridorofFadingEchoes = MapPlane( Jarilo_CorridorofFadingEchoes = MapPlane(
id=11, id=19,
name='Jarilo_CorridorofFadingEchoes', name='Jarilo_CorridorofFadingEchoes',
cn='残响回廊', cn='残响回廊',
cht='殘響迴廊', cht='殘響迴廊',
@ -92,7 +156,7 @@ Jarilo_CorridorofFadingEchoes = MapPlane(
jp='残響回廊', jp='残響回廊',
) )
Jarilo_EverwinterHill = MapPlane( Jarilo_EverwinterHill = MapPlane(
id=12, id=20,
name='Jarilo_EverwinterHill', name='Jarilo_EverwinterHill',
cn='永冬岭', cn='永冬岭',
cht='永冬嶺', cht='永冬嶺',
@ -100,7 +164,7 @@ Jarilo_EverwinterHill = MapPlane(
jp='常冬峰', jp='常冬峰',
) )
Jarilo_BoulderTown = MapPlane( Jarilo_BoulderTown = MapPlane(
id=13, id=21,
name='Jarilo_BoulderTown', name='Jarilo_BoulderTown',
cn='磐岩镇', cn='磐岩镇',
cht='磐岩鎮', cht='磐岩鎮',
@ -108,7 +172,7 @@ Jarilo_BoulderTown = MapPlane(
jp='ボルダータウン', jp='ボルダータウン',
) )
Jarilo_GreatMine = MapPlane( Jarilo_GreatMine = MapPlane(
id=14, id=22,
name='Jarilo_GreatMine', name='Jarilo_GreatMine',
cn='大矿区', cn='大矿区',
cht='大礦區', cht='大礦區',
@ -116,7 +180,7 @@ Jarilo_GreatMine = MapPlane(
jp='大鉱区', jp='大鉱区',
) )
Jarilo_RivetTown = MapPlane( Jarilo_RivetTown = MapPlane(
id=15, id=23,
name='Jarilo_RivetTown', name='Jarilo_RivetTown',
cn='铆钉镇', cn='铆钉镇',
cht='鉚釘鎮', cht='鉚釘鎮',
@ -124,7 +188,7 @@ Jarilo_RivetTown = MapPlane(
jp='リベットタウン', jp='リベットタウン',
) )
Jarilo_RobotSettlement = MapPlane( Jarilo_RobotSettlement = MapPlane(
id=16, id=24,
name='Jarilo_RobotSettlement', name='Jarilo_RobotSettlement',
cn='机械聚落', cn='机械聚落',
cht='機械聚落', cht='機械聚落',
@ -132,7 +196,7 @@ Jarilo_RobotSettlement = MapPlane(
jp='機械集落', jp='機械集落',
) )
Luofu_CentralStarskiffHaven = MapPlane( Luofu_CentralStarskiffHaven = MapPlane(
id=17, id=25,
name='Luofu_CentralStarskiffHaven', name='Luofu_CentralStarskiffHaven',
cn='星槎海中枢', cn='星槎海中枢',
cht='星槎海中樞', cht='星槎海中樞',
@ -140,7 +204,7 @@ Luofu_CentralStarskiffHaven = MapPlane(
jp='星槎海中枢', jp='星槎海中枢',
) )
Luofu_Cloudford = MapPlane( Luofu_Cloudford = MapPlane(
id=18, id=26,
name='Luofu_Cloudford', name='Luofu_Cloudford',
cn='流云渡', cn='流云渡',
cht='流雲渡', cht='流雲渡',
@ -148,7 +212,7 @@ Luofu_Cloudford = MapPlane(
jp='流雲渡し', jp='流雲渡し',
) )
Luofu_StargazerNavalia = MapPlane( Luofu_StargazerNavalia = MapPlane(
id=19, id=27,
name='Luofu_StargazerNavalia', name='Luofu_StargazerNavalia',
cn='迴星港', cn='迴星港',
cht='迴星港', cht='迴星港',
@ -156,7 +220,7 @@ Luofu_StargazerNavalia = MapPlane(
jp='廻星港', jp='廻星港',
) )
Luofu_ExaltingSanctum = MapPlane( Luofu_ExaltingSanctum = MapPlane(
id=20, id=28,
name='Luofu_ExaltingSanctum', name='Luofu_ExaltingSanctum',
cn='长乐天', cn='长乐天',
cht='長樂天', cht='長樂天',
@ -164,7 +228,7 @@ Luofu_ExaltingSanctum = MapPlane(
jp='長楽天', jp='長楽天',
) )
Luofu_AurumAlley = MapPlane( Luofu_AurumAlley = MapPlane(
id=21, id=29,
name='Luofu_AurumAlley', name='Luofu_AurumAlley',
cn='金人巷', cn='金人巷',
cht='金人巷', cht='金人巷',
@ -172,7 +236,7 @@ Luofu_AurumAlley = MapPlane(
jp='金人巷', jp='金人巷',
) )
Luofu_DivinationCommission = MapPlane( Luofu_DivinationCommission = MapPlane(
id=22, id=30,
name='Luofu_DivinationCommission', name='Luofu_DivinationCommission',
cn='太卜司', cn='太卜司',
cht='太卜司', cht='太卜司',
@ -180,7 +244,7 @@ Luofu_DivinationCommission = MapPlane(
jp='太卜司', jp='太卜司',
) )
Luofu_ArtisanshipCommission = MapPlane( Luofu_ArtisanshipCommission = MapPlane(
id=23, id=31,
name='Luofu_ArtisanshipCommission', name='Luofu_ArtisanshipCommission',
cn='工造司', cn='工造司',
cht='工造司', cht='工造司',
@ -188,7 +252,7 @@ Luofu_ArtisanshipCommission = MapPlane(
jp='工造司', jp='工造司',
) )
Luofu_AlchemyCommission = MapPlane( Luofu_AlchemyCommission = MapPlane(
id=24, id=32,
name='Luofu_AlchemyCommission', name='Luofu_AlchemyCommission',
cn='丹鼎司', cn='丹鼎司',
cht='丹鼎司', cht='丹鼎司',
@ -196,7 +260,7 @@ Luofu_AlchemyCommission = MapPlane(
jp='丹鼎司', jp='丹鼎司',
) )
Luofu_ScalegorgeWaterscape = MapPlane( Luofu_ScalegorgeWaterscape = MapPlane(
id=25, id=33,
name='Luofu_ScalegorgeWaterscape', name='Luofu_ScalegorgeWaterscape',
cn='鳞渊境', cn='鳞渊境',
cht='鱗淵境', cht='鱗淵境',

View File

@ -1,5 +1,7 @@
from tasks.map.route.base import RouteData from tasks.map.route.base import RouteData
# This file was auto-generated, do not modify it manually. To generate:
# ``` python -m dev_tools.route_extract ```
ForgottenHallStage1__route = RouteData( ForgottenHallStage1__route = RouteData(
name='ForgottenHallStage1__route', name='ForgottenHallStage1__route',