Skip to content

Commit

Permalink
Bug fixes, adding support for mingyulab
Browse files Browse the repository at this point in the history
  • Loading branch information
ProblemFactory committed May 9, 2021
1 parent a3f25eb commit 02707d2
Show file tree
Hide file tree
Showing 5 changed files with 169 additions and 76 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
ArtScanner/artifacts.genshinart.json
ArtScanner/artifacts.mingyulab.json
ArtScanner/artifacts.dat
ArtScanner/artifacts.dat.index
ArtScanner/artifacts.dat.lock
Expand Down
181 changes: 121 additions & 60 deletions ArtScanner/ArtsInfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,30 +44,6 @@
"FIGHT_PROP_FIRE_SUB_HURT": "火元素伤害减免",
}
AttrName2Ids = {v: i.replace('_PERCENT', '') for i, v in MainAttrNames.items()}
AttrNamesGensinArt = {
"FIGHT_PROP_CRITICAL": "critical",
"FIGHT_PROP_CRITICAL_HURT": "criticalDamage",
"FIGHT_PROP_ATTACK": "attackStatic",
"FIGHT_PROP_ATTACK_PERCENT": "attackPercentage",
"FIGHT_PROP_ELEMENT_MASTERY": "elementalMastery",
"FIGHT_PROP_CHARGE_EFFICIENCY": "recharge",
"FIGHT_PROP_HP": "lifeStatic",
"FIGHT_PROP_HP_PERCENT": "lifePercentage",
"FIGHT_PROP_DEFENSE": "defendStatic",
"FIGHT_PROP_DEFENSE_PERCENT": "defendPercentage",
"FIGHT_PROP_PHYSICAL_ADD_HURT": "physicalBonus",
"FIGHT_PROP_HEAL_ADD": "cureEffect",
"FIGHT_PROP_ROCK_ADD_HURT": "rockBonus",
"FIGHT_PROP_WIND_ADD_HURT": "windBonus",
"FIGHT_PROP_ICE_ADD_HURT": "iceBonus",
"FIGHT_PROP_WATER_ADD_HURT": "waterBonus",
"FIGHT_PROP_FIRE_ADD_HURT": "fireBonus",
"FIGHT_PROP_ELEC_ADD_HURT": "thunderBonus",
"FIGHT_PROP_GRASS_ADD_HURT": "grassBonus",
"FIGHT_PROP_FIRE_SUB_HURT": "fireDeduct",
}

TypeNamesGenshinArt = ["flower", "feather", "sand", "cup", "head"]

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

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

SetNamesGenshinArt = [
"archaicPetra", # 悠古的磐岩
"blizzardStrayer", # 冰风迷途的勇士
"bloodstainedChivalry", # 染血的骑士道
"crimsonWitch", # 炽烈的炎之魔女
"gladiatorFinale", # 角斗士的终幕礼
"heartOfDepth", # 沉沦之心
"lavaWalker", # 渡过烈火的贤人
"maidenBeloved", # 被怜爱的少女
"noblesseOblige", # 昔日宗室之仪
"retracingBolide", # 逆飞的流星
"thunderSmoother", # 平息雷鸣的尊者
"thunderingFury", # 如雷的盛怒
"viridescentVenerer", # 翠绿之影
"wandererTroupe", # 流浪大地的乐团
"berserker", # 战狂
"braveHeart", # 勇士之心
"defenderWill", # 守护之心
"exile", # 流放者
"gambler", # 赌徒
"instructor", # 教官
"martialArtist", # 武人
"prayersForDestiny", # 祭水之人
"prayersForIllumination", # 祭火之人
"prayersForWisdom", # 祭雷之人
"prayersToSpringtime", # 祭冰之人
"resolutionOfSojourner", # 行者之心
"scholar", # 学士
"tinyMiracle", # 奇迹
"adventurer", # 冒险家
"luckyDog", # 幸运儿
"travelingDoctor", # 游医
"tenacityOfTheMillelith", # 千岩牢固
"paleFlame", # 苍白之火
]

ArtNames = [
["磐陀裂生之花", "嵯峨群峰之翼", "星罗圭璧之晷", "巉岩琢塑之樽", "不动玄石之相"],
["历经风雪的思念", "摧冰而行的执望", "冰雪故园的终期", "遍结寒霜的傲骨", "破冰踏雪的回音"],
Expand Down Expand Up @@ -193,4 +133,125 @@
"罗莎莉亚",
"烟绯",
"尤拉",
]


TypeNamesGenshinArt = ["flower", "feather", "sand", "cup", "head"]
AttrNamesGensinArt = {
"FIGHT_PROP_CRITICAL": "critical",
"FIGHT_PROP_CRITICAL_HURT": "criticalDamage",
"FIGHT_PROP_ATTACK": "attackStatic",
"FIGHT_PROP_ATTACK_PERCENT": "attackPercentage",
"FIGHT_PROP_ELEMENT_MASTERY": "elementalMastery",
"FIGHT_PROP_CHARGE_EFFICIENCY": "recharge",
"FIGHT_PROP_HP": "lifeStatic",
"FIGHT_PROP_HP_PERCENT": "lifePercentage",
"FIGHT_PROP_DEFENSE": "defendStatic",
"FIGHT_PROP_DEFENSE_PERCENT": "defendPercentage",
"FIGHT_PROP_PHYSICAL_ADD_HURT": "physicalBonus",
"FIGHT_PROP_HEAL_ADD": "cureEffect",
"FIGHT_PROP_ROCK_ADD_HURT": "rockBonus",
"FIGHT_PROP_WIND_ADD_HURT": "windBonus",
"FIGHT_PROP_ICE_ADD_HURT": "iceBonus",
"FIGHT_PROP_WATER_ADD_HURT": "waterBonus",
"FIGHT_PROP_FIRE_ADD_HURT": "fireBonus",
"FIGHT_PROP_ELEC_ADD_HURT": "thunderBonus",
"FIGHT_PROP_GRASS_ADD_HURT": "grassBonus",
"FIGHT_PROP_FIRE_SUB_HURT": "fireDeduct",
}
SetNamesGenshinArt = [
"archaicPetra", # 悠古的磐岩
"blizzardStrayer", # 冰风迷途的勇士
"bloodstainedChivalry", # 染血的骑士道
"crimsonWitch", # 炽烈的炎之魔女
"gladiatorFinale", # 角斗士的终幕礼
"heartOfDepth", # 沉沦之心
"lavaWalker", # 渡过烈火的贤人
"maidenBeloved", # 被怜爱的少女
"noblesseOblige", # 昔日宗室之仪
"retracingBolide", # 逆飞的流星
"thunderSmoother", # 平息雷鸣的尊者
"thunderingFury", # 如雷的盛怒
"viridescentVenerer", # 翠绿之影
"wandererTroupe", # 流浪大地的乐团
"berserker", # 战狂
"braveHeart", # 勇士之心
"defenderWill", # 守护之心
"exile", # 流放者
"gambler", # 赌徒
"instructor", # 教官
"martialArtist", # 武人
"prayersForDestiny", # 祭水之人
"prayersForIllumination", # 祭火之人
"prayersForWisdom", # 祭雷之人
"prayersToSpringtime", # 祭冰之人
"resolutionOfSojourner", # 行者之心
"scholar", # 学士
"tinyMiracle", # 奇迹
"adventurer", # 冒险家
"luckyDog", # 幸运儿
"travelingDoctor", # 游医
"tenacityOfTheMillelith", # 千岩牢固
"paleFlame", # 苍白之火
]


TypeNamesMingyuLab = ['flower', 'plume', 'eon', 'goblet', 'circlet']
AttrNamesMingyuLab = {
"FIGHT_PROP_CRITICAL": "critRate",
"FIGHT_PROP_CRITICAL_HURT": "critDamage",
"FIGHT_PROP_ATTACK": "flatATK",
"FIGHT_PROP_ATTACK_PERCENT": "percentATK",
"FIGHT_PROP_ELEMENT_MASTERY": "elementalMastery",
"FIGHT_PROP_CHARGE_EFFICIENCY": "energyRecharge",
"FIGHT_PROP_HP": "flatHP",
"FIGHT_PROP_HP_PERCENT": "percentHP",
"FIGHT_PROP_DEFENSE": "flatDEF",
"FIGHT_PROP_DEFENSE_PERCENT": "percentDEF",
"FIGHT_PROP_PHYSICAL_ADD_HURT": "physicalDamage",
"FIGHT_PROP_HEAL_ADD": "healing",
"FIGHT_PROP_ROCK_ADD_HURT": "geoDamage",
"FIGHT_PROP_WIND_ADD_HURT": "anemoDamage",
"FIGHT_PROP_ICE_ADD_HURT": "cryoDamage",
"FIGHT_PROP_WATER_ADD_HURT": "hydroDamage",
"FIGHT_PROP_FIRE_ADD_HURT": "pyroDamage",
"FIGHT_PROP_ELEC_ADD_HURT": "electroDamage",
"FIGHT_PROP_GRASS_ADD_HURT": "dendroDamage",
"FIGHT_PROP_FIRE_SUB_HURT": "pyroDEF",
}

SetNamesMingyuLab = [
"archaic_petra", # 悠古的磐岩
"blizzard_walker", # 冰风迷途的勇士
"bloodstained_chivalry", # 染血的骑士道
"crimson_witch_of_flames", # 炽烈的炎之魔女
"gladiators_finale", # 角斗士的终幕礼
"heart_of_depth", # 沉沦之心
"lavawalker", # 渡过烈火的贤人
"maiden_beloved", # 被怜爱的少女
"noblesse_oblige", # 昔日宗室之仪
"retracing_bolide", # 逆飞的流星
"thundersoother", # 平息雷鸣的尊者
"thundering_fury", # 如雷的盛怒
"viridescent_venerer", # 翠绿之影
"wanderers_troupe", # 流浪大地的乐团
"berserker", # 战狂
"brave_heart", # 勇士之心
"defenders_will", # 守护之心
"the_exile", # 流放者
"gambler", # 赌徒
"instructor", # 教官
"martial_artist", # 武人
"prayers_of_destiny", # 祭水之人
"prayers_of_illumination", # 祭火之人
"prayers_of_wisdom", # 祭雷之人
"prayers_of_springtime", # 祭冰之人
"resolution_of_sojourner", # 行者之心
"scholar", # 学士
"tiny_miracle", # 奇迹
"adventurer", # 冒险家
"lucky_dog", # 幸运儿
"traveling_doctor", # 游医
"tenacity_of_the_millelith", # 千岩牢固
"pale_flame", # 苍白之火
]
25 changes: 22 additions & 3 deletions ArtScanner/art_saver.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,10 @@ def __init__(self, info, image):
image: PIL.Image, screenshot of the artifact, will be shrinked to 300x512 to save space
'''
typeid = ArtsInfo.TypeNames.index(info['type'])
setid = [i for i, v in enumerate(
self.setid = [i for i, v in enumerate(
ArtsInfo.ArtNames) if info['name'] in v][0]
self.name = info['name']
self.type = ArtifactType(typeid)
self.setname = ArtsInfo.SetNamesGenshinArt[setid]
self.level = decodeValue(info['level'])
self.rarity = info['star']
self.stat = ArtifactStat(
Expand Down Expand Up @@ -189,7 +188,7 @@ def exportGenshinArtJSON(self, path):
art = self.root[str(art_id)]
result[ArtsInfo.TypeNamesGenshinArt[art.type]].append(
{
"setName": art.setname,
"setName": ArtsInfo.SetNamesGenshinArt[art.setid],
"position": ArtsInfo.TypeNamesGenshinArt[art.type],
"detailName": art.name,
"mainTag": {
Expand All @@ -213,6 +212,26 @@ def exportGenshinArtJSON(self, path):
s = json.dumps(result, ensure_ascii=False)
f.write(s.encode('utf-8'))
f.close()

def exportMingyuLabJSON(self, path):
result = []
for art_id in range(self.root['size']):
art = self.root[str(art_id)]
result.append({
"asKey": ArtsInfo.SetNamesMingyuLab[art.setid],
"rarity": art.rarity,
"slot": ArtsInfo.TypeNamesMingyuLab[art.type],
"level": art.level,
"mainStat": ArtsInfo.AttrNamesMingyuLab[art.stat.type.name],
"mark": "none"
})
for i, stat in enumerate(art.substats):
result[-1][f"subStat{i+1}Type"] = ArtsInfo.AttrNamesMingyuLab[stat.type.name]
result[-1][f"subStat{i+1}Value"] = ArtsInfo.Formats[stat.type.name].format(stat.value).replace('%', '').replace(',', '')
f = open(path, "wb")
s = json.dumps(result, ensure_ascii=False)
f.write(s.encode('utf-8'))
f.close()

if __name__=='__main__':
art = Artifact({
Expand Down
29 changes: 19 additions & 10 deletions ArtScanner/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def is_admin():

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

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

setWindowToForeground(hwnd)

time.sleep(5)

art_scanner = ArtScannerLogic(game_info)
art_data = ArtDatabase('artifacts.dat')

try:
level_threshold = int(level_threshold)
except:
Expand All @@ -130,13 +138,14 @@ def is_admin():
scroll_interval = float(scroll_interval)
except:
scroll_interval = 0.05
try:
exporter = [art_data.exportGenshinArtJSON, art_data.exportMingyuLabJSON][int(export_type)]
export_name = ['artifacts.genshinart.json', 'artifacts.mingyulab.json'][int(export_type)]
except:
exporter = art_data.exportGenshinArtJSON
export_name = 'artifacts.genshinart.json'

setWindowToForeground(hwnd)

time.sleep(5)

art_scanner = ArtScannerLogic(game_info)
art_data = ArtDatabase('artifacts.dat')
mouse.on_middle_click(art_scanner.interrupt)

print('正在自动对齐')
Expand Down Expand Up @@ -185,8 +194,8 @@ def artscannerCallback(art_img):
print()
print(f"因为\"{repr(e)}\"而意外停止扫描,将保存已扫描的圣遗物信息")
if saved != 0:
art_data.exportGenshinArtJSON('artifacts.genshinart.json')
print(f'总计扫描了{skipped+saved}/{art_id}个圣遗物,保存了{saved}个到artifacts.genshinart.json,失败了{failed}个')
exporter(export_name)
print(f'总计扫描了{skipped+saved}/{art_id}个圣遗物,保存了{saved}个到{export_name},失败了{failed}个')
print('无效识别/失败结果请到artifacts路径中查看')
print('----------------------------')
print('圣遗物星级分布:(保存数量/扫描数量)')
Expand Down
9 changes: 6 additions & 3 deletions ArtScanner/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@ def setWindowToForeground(hwnd):
keyboard.release('alt')

def getProcessName(hwnd):
pid = win32process.GetWindowThreadProcessId(hwnd)
handle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, False, pid[1])
return win32process.GetModuleFileNameEx(handle, 0)
try:
pid = win32process.GetWindowThreadProcessId(hwnd)
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid[1])
return win32process.GetModuleFileNameEx(handle, 0)
except:
return "Unknown"

def findWindowsByName(name):
windows = []
Expand Down

0 comments on commit 02707d2

Please sign in to comment.