Skip to content

Commit 02707d2

Browse files
Bug fixes, adding support for mingyulab
1 parent a3f25eb commit 02707d2

File tree

5 files changed

+169
-76
lines changed

5 files changed

+169
-76
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
ArtScanner/artifacts.genshinart.json
2+
ArtScanner/artifacts.mingyulab.json
23
ArtScanner/artifacts.dat
34
ArtScanner/artifacts.dat.index
45
ArtScanner/artifacts.dat.lock

ArtScanner/ArtsInfo.py

Lines changed: 121 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,6 @@
4444
"FIGHT_PROP_FIRE_SUB_HURT": "火元素伤害减免",
4545
}
4646
AttrName2Ids = {v: i.replace('_PERCENT', '') for i, v in MainAttrNames.items()}
47-
AttrNamesGensinArt = {
48-
"FIGHT_PROP_CRITICAL": "critical",
49-
"FIGHT_PROP_CRITICAL_HURT": "criticalDamage",
50-
"FIGHT_PROP_ATTACK": "attackStatic",
51-
"FIGHT_PROP_ATTACK_PERCENT": "attackPercentage",
52-
"FIGHT_PROP_ELEMENT_MASTERY": "elementalMastery",
53-
"FIGHT_PROP_CHARGE_EFFICIENCY": "recharge",
54-
"FIGHT_PROP_HP": "lifeStatic",
55-
"FIGHT_PROP_HP_PERCENT": "lifePercentage",
56-
"FIGHT_PROP_DEFENSE": "defendStatic",
57-
"FIGHT_PROP_DEFENSE_PERCENT": "defendPercentage",
58-
"FIGHT_PROP_PHYSICAL_ADD_HURT": "physicalBonus",
59-
"FIGHT_PROP_HEAL_ADD": "cureEffect",
60-
"FIGHT_PROP_ROCK_ADD_HURT": "rockBonus",
61-
"FIGHT_PROP_WIND_ADD_HURT": "windBonus",
62-
"FIGHT_PROP_ICE_ADD_HURT": "iceBonus",
63-
"FIGHT_PROP_WATER_ADD_HURT": "waterBonus",
64-
"FIGHT_PROP_FIRE_ADD_HURT": "fireBonus",
65-
"FIGHT_PROP_ELEC_ADD_HURT": "thunderBonus",
66-
"FIGHT_PROP_GRASS_ADD_HURT": "grassBonus",
67-
"FIGHT_PROP_FIRE_SUB_HURT": "fireDeduct",
68-
}
69-
70-
TypeNamesGenshinArt = ["flower", "feather", "sand", "cup", "head"]
7147

7248
TypeNames = ["生之花", "死之羽", "时之沙", "空之杯", "理之冠"]
7349

@@ -87,42 +63,6 @@
8763
RarityToMaxLvs = [4, 4, 12, 16, 20]
8864
RarityToBaseStatNumber = {1:[0], 2:[0,1], 3:[1,2], 4:[2,3], 5:[3,4]}
8965

90-
SetNamesGenshinArt = [
91-
"archaicPetra", # 悠古的磐岩
92-
"blizzardStrayer", # 冰风迷途的勇士
93-
"bloodstainedChivalry", # 染血的骑士道
94-
"crimsonWitch", # 炽烈的炎之魔女
95-
"gladiatorFinale", # 角斗士的终幕礼
96-
"heartOfDepth", # 沉沦之心
97-
"lavaWalker", # 渡过烈火的贤人
98-
"maidenBeloved", # 被怜爱的少女
99-
"noblesseOblige", # 昔日宗室之仪
100-
"retracingBolide", # 逆飞的流星
101-
"thunderSmoother", # 平息雷鸣的尊者
102-
"thunderingFury", # 如雷的盛怒
103-
"viridescentVenerer", # 翠绿之影
104-
"wandererTroupe", # 流浪大地的乐团
105-
"berserker", # 战狂
106-
"braveHeart", # 勇士之心
107-
"defenderWill", # 守护之心
108-
"exile", # 流放者
109-
"gambler", # 赌徒
110-
"instructor", # 教官
111-
"martialArtist", # 武人
112-
"prayersForDestiny", # 祭水之人
113-
"prayersForIllumination", # 祭火之人
114-
"prayersForWisdom", # 祭雷之人
115-
"prayersToSpringtime", # 祭冰之人
116-
"resolutionOfSojourner", # 行者之心
117-
"scholar", # 学士
118-
"tinyMiracle", # 奇迹
119-
"adventurer", # 冒险家
120-
"luckyDog", # 幸运儿
121-
"travelingDoctor", # 游医
122-
"tenacityOfTheMillelith", # 千岩牢固
123-
"paleFlame", # 苍白之火
124-
]
125-
12666
ArtNames = [
12767
["磐陀裂生之花", "嵯峨群峰之翼", "星罗圭璧之晷", "巉岩琢塑之樽", "不动玄石之相"],
12868
["历经风雪的思念", "摧冰而行的执望", "冰雪故园的终期", "遍结寒霜的傲骨", "破冰踏雪的回音"],
@@ -193,4 +133,125 @@
193133
"罗莎莉亚",
194134
"烟绯",
195135
"尤拉",
136+
]
137+
138+
139+
TypeNamesGenshinArt = ["flower", "feather", "sand", "cup", "head"]
140+
AttrNamesGensinArt = {
141+
"FIGHT_PROP_CRITICAL": "critical",
142+
"FIGHT_PROP_CRITICAL_HURT": "criticalDamage",
143+
"FIGHT_PROP_ATTACK": "attackStatic",
144+
"FIGHT_PROP_ATTACK_PERCENT": "attackPercentage",
145+
"FIGHT_PROP_ELEMENT_MASTERY": "elementalMastery",
146+
"FIGHT_PROP_CHARGE_EFFICIENCY": "recharge",
147+
"FIGHT_PROP_HP": "lifeStatic",
148+
"FIGHT_PROP_HP_PERCENT": "lifePercentage",
149+
"FIGHT_PROP_DEFENSE": "defendStatic",
150+
"FIGHT_PROP_DEFENSE_PERCENT": "defendPercentage",
151+
"FIGHT_PROP_PHYSICAL_ADD_HURT": "physicalBonus",
152+
"FIGHT_PROP_HEAL_ADD": "cureEffect",
153+
"FIGHT_PROP_ROCK_ADD_HURT": "rockBonus",
154+
"FIGHT_PROP_WIND_ADD_HURT": "windBonus",
155+
"FIGHT_PROP_ICE_ADD_HURT": "iceBonus",
156+
"FIGHT_PROP_WATER_ADD_HURT": "waterBonus",
157+
"FIGHT_PROP_FIRE_ADD_HURT": "fireBonus",
158+
"FIGHT_PROP_ELEC_ADD_HURT": "thunderBonus",
159+
"FIGHT_PROP_GRASS_ADD_HURT": "grassBonus",
160+
"FIGHT_PROP_FIRE_SUB_HURT": "fireDeduct",
161+
}
162+
SetNamesGenshinArt = [
163+
"archaicPetra", # 悠古的磐岩
164+
"blizzardStrayer", # 冰风迷途的勇士
165+
"bloodstainedChivalry", # 染血的骑士道
166+
"crimsonWitch", # 炽烈的炎之魔女
167+
"gladiatorFinale", # 角斗士的终幕礼
168+
"heartOfDepth", # 沉沦之心
169+
"lavaWalker", # 渡过烈火的贤人
170+
"maidenBeloved", # 被怜爱的少女
171+
"noblesseOblige", # 昔日宗室之仪
172+
"retracingBolide", # 逆飞的流星
173+
"thunderSmoother", # 平息雷鸣的尊者
174+
"thunderingFury", # 如雷的盛怒
175+
"viridescentVenerer", # 翠绿之影
176+
"wandererTroupe", # 流浪大地的乐团
177+
"berserker", # 战狂
178+
"braveHeart", # 勇士之心
179+
"defenderWill", # 守护之心
180+
"exile", # 流放者
181+
"gambler", # 赌徒
182+
"instructor", # 教官
183+
"martialArtist", # 武人
184+
"prayersForDestiny", # 祭水之人
185+
"prayersForIllumination", # 祭火之人
186+
"prayersForWisdom", # 祭雷之人
187+
"prayersToSpringtime", # 祭冰之人
188+
"resolutionOfSojourner", # 行者之心
189+
"scholar", # 学士
190+
"tinyMiracle", # 奇迹
191+
"adventurer", # 冒险家
192+
"luckyDog", # 幸运儿
193+
"travelingDoctor", # 游医
194+
"tenacityOfTheMillelith", # 千岩牢固
195+
"paleFlame", # 苍白之火
196+
]
197+
198+
199+
TypeNamesMingyuLab = ['flower', 'plume', 'eon', 'goblet', 'circlet']
200+
AttrNamesMingyuLab = {
201+
"FIGHT_PROP_CRITICAL": "critRate",
202+
"FIGHT_PROP_CRITICAL_HURT": "critDamage",
203+
"FIGHT_PROP_ATTACK": "flatATK",
204+
"FIGHT_PROP_ATTACK_PERCENT": "percentATK",
205+
"FIGHT_PROP_ELEMENT_MASTERY": "elementalMastery",
206+
"FIGHT_PROP_CHARGE_EFFICIENCY": "energyRecharge",
207+
"FIGHT_PROP_HP": "flatHP",
208+
"FIGHT_PROP_HP_PERCENT": "percentHP",
209+
"FIGHT_PROP_DEFENSE": "flatDEF",
210+
"FIGHT_PROP_DEFENSE_PERCENT": "percentDEF",
211+
"FIGHT_PROP_PHYSICAL_ADD_HURT": "physicalDamage",
212+
"FIGHT_PROP_HEAL_ADD": "healing",
213+
"FIGHT_PROP_ROCK_ADD_HURT": "geoDamage",
214+
"FIGHT_PROP_WIND_ADD_HURT": "anemoDamage",
215+
"FIGHT_PROP_ICE_ADD_HURT": "cryoDamage",
216+
"FIGHT_PROP_WATER_ADD_HURT": "hydroDamage",
217+
"FIGHT_PROP_FIRE_ADD_HURT": "pyroDamage",
218+
"FIGHT_PROP_ELEC_ADD_HURT": "electroDamage",
219+
"FIGHT_PROP_GRASS_ADD_HURT": "dendroDamage",
220+
"FIGHT_PROP_FIRE_SUB_HURT": "pyroDEF",
221+
}
222+
223+
SetNamesMingyuLab = [
224+
"archaic_petra", # 悠古的磐岩
225+
"blizzard_walker", # 冰风迷途的勇士
226+
"bloodstained_chivalry", # 染血的骑士道
227+
"crimson_witch_of_flames", # 炽烈的炎之魔女
228+
"gladiators_finale", # 角斗士的终幕礼
229+
"heart_of_depth", # 沉沦之心
230+
"lavawalker", # 渡过烈火的贤人
231+
"maiden_beloved", # 被怜爱的少女
232+
"noblesse_oblige", # 昔日宗室之仪
233+
"retracing_bolide", # 逆飞的流星
234+
"thundersoother", # 平息雷鸣的尊者
235+
"thundering_fury", # 如雷的盛怒
236+
"viridescent_venerer", # 翠绿之影
237+
"wanderers_troupe", # 流浪大地的乐团
238+
"berserker", # 战狂
239+
"brave_heart", # 勇士之心
240+
"defenders_will", # 守护之心
241+
"the_exile", # 流放者
242+
"gambler", # 赌徒
243+
"instructor", # 教官
244+
"martial_artist", # 武人
245+
"prayers_of_destiny", # 祭水之人
246+
"prayers_of_illumination", # 祭火之人
247+
"prayers_of_wisdom", # 祭雷之人
248+
"prayers_of_springtime", # 祭冰之人
249+
"resolution_of_sojourner", # 行者之心
250+
"scholar", # 学士
251+
"tiny_miracle", # 奇迹
252+
"adventurer", # 冒险家
253+
"lucky_dog", # 幸运儿
254+
"traveling_doctor", # 游医
255+
"tenacity_of_the_millelith", # 千岩牢固
256+
"pale_flame", # 苍白之火
196257
]

ArtScanner/art_saver.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,10 @@ def __init__(self, info, image):
9696
image: PIL.Image, screenshot of the artifact, will be shrinked to 300x512 to save space
9797
'''
9898
typeid = ArtsInfo.TypeNames.index(info['type'])
99-
setid = [i for i, v in enumerate(
99+
self.setid = [i for i, v in enumerate(
100100
ArtsInfo.ArtNames) if info['name'] in v][0]
101101
self.name = info['name']
102102
self.type = ArtifactType(typeid)
103-
self.setname = ArtsInfo.SetNamesGenshinArt[setid]
104103
self.level = decodeValue(info['level'])
105104
self.rarity = info['star']
106105
self.stat = ArtifactStat(
@@ -189,7 +188,7 @@ def exportGenshinArtJSON(self, path):
189188
art = self.root[str(art_id)]
190189
result[ArtsInfo.TypeNamesGenshinArt[art.type]].append(
191190
{
192-
"setName": art.setname,
191+
"setName": ArtsInfo.SetNamesGenshinArt[art.setid],
193192
"position": ArtsInfo.TypeNamesGenshinArt[art.type],
194193
"detailName": art.name,
195194
"mainTag": {
@@ -213,6 +212,26 @@ def exportGenshinArtJSON(self, path):
213212
s = json.dumps(result, ensure_ascii=False)
214213
f.write(s.encode('utf-8'))
215214
f.close()
215+
216+
def exportMingyuLabJSON(self, path):
217+
result = []
218+
for art_id in range(self.root['size']):
219+
art = self.root[str(art_id)]
220+
result.append({
221+
"asKey": ArtsInfo.SetNamesMingyuLab[art.setid],
222+
"rarity": art.rarity,
223+
"slot": ArtsInfo.TypeNamesMingyuLab[art.type],
224+
"level": art.level,
225+
"mainStat": ArtsInfo.AttrNamesMingyuLab[art.stat.type.name],
226+
"mark": "none"
227+
})
228+
for i, stat in enumerate(art.substats):
229+
result[-1][f"subStat{i+1}Type"] = ArtsInfo.AttrNamesMingyuLab[stat.type.name]
230+
result[-1][f"subStat{i+1}Value"] = ArtsInfo.Formats[stat.type.name].format(stat.value).replace('%', '').replace(',', '')
231+
f = open(path, "wb")
232+
s = json.dumps(result, ensure_ascii=False)
233+
f.write(s.encode('utf-8'))
234+
f.close()
216235

217236
if __name__=='__main__':
218237
art = Artifact({

ArtScanner/main.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def is_admin():
6464

6565
if game_info.w==0 or game_info.h==0:
6666
print("不支持独占全屏模式")
67-
game_info.w, game_info.h = eval(input("如果要强行继续运行,请输入原神的分辨率,格式是\"宽,高\",例如 1920,1080(不用引号):"))
67+
game_info.w, game_info.h = eval(input("如果要尝试继续运行,请输入原神的分辨率,格式是\"宽,高\",例如 1920,1080(不用引号):"))
6868
game_info.left, game_info.top = 0, 0
6969

7070
game_info.calculateCoordinates()
@@ -111,13 +111,21 @@ def is_admin():
111111
input('运行期间请保持原神在前台,请勿遮挡窗口或操作鼠标,按鼠标中键停止。按回车继续')
112112
input('开始后将尝试自动对齐第一行以方便识别,若对齐结果有误,请立刻按中键停止。按回车继续')
113113
print('---------------------------------')
114-
if input('是否进行高级设置,例如等级过滤,稀有度过滤,翻页延迟,确认请输入y:').strip().lower()=='y':
114+
if input('是否进行高级设置,例如等级过滤,稀有度过滤,翻页延迟,导出格式,确认请输入y:').strip().lower()=='y':
115+
export_type = input('请输入需要的导出格式,0=莫娜的占卜铺(回车默认值),1=MingyuLab。')
115116
level_threshold = input('请输入圣遗物等级阈值(0-20)(比如:16,则仅将保存16级及以上的圣遗物信息)。直接按回车则默认保存所有圣遗物信息。')
116117
rarity_threshold = input('请输入圣遗物星级阈值(1-5)(比如:5,则仅将保存5星的圣遗物信息)。直接按回车则默认保存所有圣遗物信息。')
117-
scroll_interval = input('请输入翻页时的检测延迟(秒),数值越小翻页速度越快,但越可能造成跳行提前结束等问题,直接回车则为默认值0.05。')
118+
scroll_interval = input('请输入翻页时的检测延迟(秒),数值越大翻页速度越慢,可以解决一些翻页时的检测BUG,直接回车则为默认值0.05。')
118119
print('---------------------------------')
119120
print('程序将于5秒后自动开始运行,若此条提示显示时未自动切换到原神窗口,请手动点击原神窗口切到前台')
120121

122+
setWindowToForeground(hwnd)
123+
124+
time.sleep(5)
125+
126+
art_scanner = ArtScannerLogic(game_info)
127+
art_data = ArtDatabase('artifacts.dat')
128+
121129
try:
122130
level_threshold = int(level_threshold)
123131
except:
@@ -130,13 +138,14 @@ def is_admin():
130138
scroll_interval = float(scroll_interval)
131139
except:
132140
scroll_interval = 0.05
141+
try:
142+
exporter = [art_data.exportGenshinArtJSON, art_data.exportMingyuLabJSON][int(export_type)]
143+
export_name = ['artifacts.genshinart.json', 'artifacts.mingyulab.json'][int(export_type)]
144+
except:
145+
exporter = art_data.exportGenshinArtJSON
146+
export_name = 'artifacts.genshinart.json'
133147

134-
setWindowToForeground(hwnd)
135148

136-
time.sleep(5)
137-
138-
art_scanner = ArtScannerLogic(game_info)
139-
art_data = ArtDatabase('artifacts.dat')
140149
mouse.on_middle_click(art_scanner.interrupt)
141150

142151
print('正在自动对齐')
@@ -185,8 +194,8 @@ def artscannerCallback(art_img):
185194
print()
186195
print(f"因为\"{repr(e)}\"而意外停止扫描,将保存已扫描的圣遗物信息")
187196
if saved != 0:
188-
art_data.exportGenshinArtJSON('artifacts.genshinart.json')
189-
print(f'总计扫描了{skipped+saved}/{art_id}个圣遗物,保存了{saved}个到artifacts.genshinart.json,失败了{failed}个')
197+
exporter(export_name)
198+
print(f'总计扫描了{skipped+saved}/{art_id}个圣遗物,保存了{saved}个到{export_name},失败了{failed}个')
190199
print('无效识别/失败结果请到artifacts路径中查看')
191200
print('----------------------------')
192201
print('圣遗物星级分布:(保存数量/扫描数量)')

ArtScanner/utils.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@ def setWindowToForeground(hwnd):
1717
keyboard.release('alt')
1818

1919
def getProcessName(hwnd):
20-
pid = win32process.GetWindowThreadProcessId(hwnd)
21-
handle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, False, pid[1])
22-
return win32process.GetModuleFileNameEx(handle, 0)
20+
try:
21+
pid = win32process.GetWindowThreadProcessId(hwnd)
22+
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid[1])
23+
return win32process.GetModuleFileNameEx(handle, 0)
24+
except:
25+
return "Unknown"
2326

2427
def findWindowsByName(name):
2528
windows = []

0 commit comments

Comments
 (0)