[圣遗物批量强化]多语言框架进一步完善 (#1891)

* docs: 重命名

* refactor: 更新页面滚动高度计算逻辑

* feat: 添加圣遗物属性命中功能并优化强化逻辑

* feat: 月落银 版本需求降至 0.49.0

* refactor(utils): 提取通用工具函数到独立文件

* refactor(utils): 提取语言配置到独立工具模块

* feat(language): 添加多语言支持功能

* feat(language): 多语言框架进一步完善
languageUtils 为 多语言模块框架 的全部配置
assets/language/ 为 多语言模块框架 的本地语言匹配图片

* docs: 添加多语言适配模块说明

* fix(holyRelicsUpUtils): 修复debug函数参数使用错误
This commit is contained in:
云端客
2025-09-13 22:16:28 +08:00
committed by GitHub
parent 36c719b772
commit 59fb3cfa4f
5 changed files with 307 additions and 138 deletions

View File

@@ -246,5 +246,9 @@
- 圣遗物属性 待激活 属性适配
## 其他
- **多语言适配(开发者)请注意**
- utils/languageUtils 为 多语言模块框架 的全部配置
- assets/language/ 为 多语言模块框架 的本地语言匹配图片
- **作者**:云端客
- **脚本反馈邮箱**doutianmianxia@qq.com

View File

@@ -1,3 +1,7 @@
// 加载 utils 模块
eval(file.readTextSync("./utils/holyRelicsUpUtils.js"));
eval(file.readTextSync("./utils/languageUtils.js"));
/**
* 主方法
* @returns {Promise<void>}
@@ -30,7 +34,7 @@ async function main(log_off = config.log_off) {
}
if (!config.toSift) {
let filteredJson = getJsonPath('filtered',false);
let filteredJson = getJsonPath('filtered', false);
let template = await templateMatch(`${filteredJson.path}${filteredJson.name}${filteredJson.type}`)
if (isExist(template)) {
config.toSift = true
@@ -54,76 +58,68 @@ async function main(log_off = config.log_off) {
//========================以下为原有封装==============================
function info(msg, must = false) {
if (config.log_off || must) {
log.info(msg)
}
holyRelicsUpUtils.info(msg, must, config.log_off)
}
function warn(msg, must = false) {
if (config.log_off || must) {
log.warn(msg)
}
holyRelicsUpUtils.warn(msg, must, config.log_off)
}
function debug(msg, must = false) {
if (config.log_off || must) {
log.debug(msg)
}
holyRelicsUpUtils.debug(msg, must, config.log_off)
}
function error(msg, must = false) {
if (config.log_off || must) {
log.error(msg)
}
holyRelicsUpUtils.error(msg, must, config.log_off)
}
function throwError(msg) {
notification.error(`${msg}`);
holyRelicsUpUtils.throwError(msg)
}
function openCaptureGameRegion() {
return captureGameRegion()
return holyRelicsUpUtils.openCaptureGameRegion()
}
function closeCaptureGameRegion(region) {
region.Dispose()
holyRelicsUpUtils.closeCaptureGameRegion(region)
}
function findByCaptureGameRegion(region, templateMatchObject) {
return region.find(templateMatchObject)
return holyRelicsUpUtils.findByCaptureGameRegion(region, templateMatchObject)
}
function findMultiByCaptureGameRegion(region, templateMatchObject) {
return region.findMulti(templateMatchObject)
return holyRelicsUpUtils.findMultiByCaptureGameRegion(region, templateMatchObject)
}
function mTo(x, y) {
moveMouseTo(x, y);
holyRelicsUpUtils.mTo(x, y);
}
function recognitionObjectOcr(x, y, width, height) {
return RecognitionObject.Ocr(x, y, width, height)
return holyRelicsUpUtils.recognitionObjectOcr(x, y, width, height)
}
function downLeftButton() {
leftButtonDown();
holyRelicsUpUtils.downLeftButton();
}
function upLeftButton() {
leftButtonUp();
holyRelicsUpUtils.upLeftButton();
}
function moveByMouse(x, y) {
moveMouseBy(x, y);
holyRelicsUpUtils.moveByMouse(x, y);
}
async function wait(ms = 1000) {
// 等待300毫秒确保按下操作生效
await sleep(ms);
await holyRelicsUpUtils.wait(ms);
}
function downClick(x, y) {
click(x, y);
holyRelicsUpUtils.downClick(x, y);
}
/**
@@ -133,32 +129,47 @@ function downClick(x, y) {
* true表示资源存在false表示资源不存在
*/
function isExist(res) {
return res.isExist() // 调用资源对象的isExist方法获取存在状态
return holyRelicsUpUtils.isExist(res) // 调用资源对象的isExist方法获取存在状态
}
//========================以上为原有封装==============================
//========================以下为基本配置==============================
const LanguageALLConfigMap = languageUtils.getLanguageALLConfigMap()
const LanguageMap = languageUtils.getLanguageMap()
const LanguageMsgMap = languageUtils.getLanguageMsgMap()
const LanguageKey = LanguageMap.get(settings.language)
if (LanguageKey === null || !LanguageKey) {
let languageMsg = LanguageMsgMap.get(settings.language)
.replace('language-key',`${settings.language}`)
.replace('languageList-key',`${Array.from(LanguageMap.keys()).join(',')}`)
throwError(languageMsg)
}
const LanguageConfigJson = LanguageALLConfigMap.get(LanguageKey)
//魔法值
const mana = LanguageConfigJson.mana
function siftAll() {
//筛选条件
let baseSiftArray = new Array('未满级')
let baseSiftArray = new Array()
baseSiftArray.push(mana.get('holyRelicsNoMax'))
if (settings.holyRelicsLockMark) {
baseSiftArray.push('标记')
baseSiftArray.push(mana.get('holyRelicsLockMark'))
}
if (settings.holyRelicsLockY) {
baseSiftArray.push('仅锁定')
baseSiftArray.push(mana.get('holyRelicsLockY'))
}
if (settings.holyRelicsLockN) {
baseSiftArray.push('未锁定')
baseSiftArray.push(mana.get('holyRelicsLockN'))
}
if (settings.holyRelicsEquipY) {
baseSiftArray.push('已装备')
baseSiftArray.push(mana.get('holyRelicsEquipY'))
}
if (settings.holyRelicsEquipN) {
baseSiftArray.push('未装备')
baseSiftArray.push(mana.get('holyRelicsEquipN'))
}
if (settings.holyRelicsSourceFrostSaint) {
baseSiftArray.push('祝圣之霜定义')
baseSiftArray.push(mana.get('holyRelicsSourceFrostSaint'))
}
return baseSiftArray
}
@@ -166,10 +177,10 @@ function siftAll() {
function sortAll() {
//筛选条件
let baseSortArray = new Array()
if (settings.sortMain === '降序') {
if (settings.sortMain === mana.get('desc_order')) {
baseSortArray.push(settings.sortMain)
}
if (settings.sortAuxiliary === '品质顺序') {
if (settings.sortAuxiliary === mana.get('quality_order')) {
baseSortArray.push(settings.sortAuxiliary)
}
return baseSortArray
@@ -203,7 +214,7 @@ const config = {
meetAllSiftAttributeHolyRelic: settings.meetAllSiftAttributeHolyRelic,//满足所有筛选条件
commonSiftAttributeHolyRelic: settings.commonSiftAttributeHolyRelic,//通用筛选条件
inputSiftAttributeHolyRelic: settings.inputSiftAttributeHolyRelic,//自定义筛选条件
language: '简体中文',
language: settings.language,
}
@@ -212,89 +223,7 @@ const genshinJson = {
height: genshin.height,
}
const LanguageALLConfigMap = new Map([
['zh-cn',
{
attributeMap: new Map([
['%', '百分比'],
['生命', '生命值'],
['防御', '防御力'],
['攻击', '攻击力'],
['暴率', '暴击率'],
['爆率', '暴击率'],
['暴伤', '暴击伤害'],
['爆伤', '暴击伤害'],
['物伤', '物理伤害加成'],
['风伤', '风元素伤害加成'],
['水伤', '水元素伤害加成'],
['雷伤', '雷元素伤害加成'],
['岩伤', '岩元素伤害加成'],
['草伤', '草元素伤害加成'],
['冰伤', '冰元素伤害加成'],
['火伤', '火元素伤害加成'],
['治疗', '治疗加成'],
['精通', '元素精通'],
['充能', '元素充能效率'],
]),
attributeList: [
'物理伤害加成'
, '风元素伤害加成'
, '水元素伤害加成'
, '雷元素伤害加成'
, '岩元素伤害加成'
, '草元素伤害加成'
, '冰元素伤害加成'
, '火元素伤害加成'
, '治疗加成'
// , '元素精通'
// , '元素充能效率'
],
attributeFixedMap: new Map([
['生之花', ['生命值']],
['死之羽', ['攻击力']],
]),
attributeHolyRelickeys: ['生命值', '防御力', '攻击力'],
holyRelicPartsAsMap: new Map([
['花', '生之花'],
['羽', '死之羽'],
['羽毛', '死之羽'],
['冠', '理之冠'],
['沙', '时之沙'],
['杯', '空之杯'],
['杯子', '空之杯'],
]),
holyRelicParts: ['生之花', '死之羽', '理之冠', '时之沙', '空之杯'],
languageMap: new Map([
// ['ascending_order', {name: '升序', type: '.jpg'}],
['attribute_sort_rules', {name: '属性排序规则', type: '.jpg'}],
['filtered', {name: '已经筛选', type: '.jpg'}],
['saint_relic_backpack_selected', {name: '已选中圣遗物背包', type: '.jpg'}],
// ['open_the_function', {name: '开启阶段放入功能', type: '.jpg'}],
['strengthen', {name: '强化', type: '.jpg'}],
// ['quickly_put_in', {name: '快捷放入', type: '.jpg'}],
['stage_put_in', {name: '阶段放入', type: '.jpg'}],
['morra_is_not_enough', {name: '摩拉不足', type: '.jpg'}],
['ascending_order_not_selected', {name: '未选中升序1', type: '.jpg'}],
['consecration_oil_paste', {name: '祝圣油膏', type: '.jpg'}],
['consecration_essence', {name: '祝圣精华', type: '.jpg'}],
['level_sort', {name: '等级顺序排序', type: '.jpg'}],
// ['level_not_max', {name: '筛选未满级', type: '.jpg'}],
['info', {name: '详情', type: '.jpg'}],
// ['up_materials_select', {name: '请选择升级材料', type: '.jpg'}],
// ['morra_need', {name: '需要摩拉', type: '.jpg'}],
]),
}
],
])
const LanguageMap = new Map([
['简体中文', 'zh-cn']
])
const LanguageKey = LanguageMap.get(config.language)
if (LanguageKey === null || !LanguageKey) {
throwError(`未找到[${config.language}]语言配置,支持语言:[${Array.from(LanguageMap.keys()).join(',')}]`)
}
const LanguageConfigJson = LanguageALLConfigMap.get(LanguageKey)
const attributeMap = LanguageConfigJson.attributeMap
const attributeList = LanguageConfigJson.attributeList
const attributeFixedMap = LanguageConfigJson.attributeFixedMap
@@ -375,7 +304,7 @@ const commonMap = new Map([
const languageMap = LanguageConfigJson.languageMap;
function getJsonPath(key, isCommon = true) {
if (isCommon){
if (isCommon) {
let commonJson = commonMap.get(key);
warn('commonJson==>' + JSON.stringify(commonJson))
if (commonJson && commonJson.sub) {
@@ -391,7 +320,7 @@ function getJsonPath(key, isCommon = true) {
path: `${commonPath}`
}
}
}else {
} else {
let languageJson = languageMap.get(key);
warn('languageJson==>' + JSON.stringify(languageJson))
if (languageJson) {
@@ -400,7 +329,7 @@ function getJsonPath(key, isCommon = true) {
type: languageJson.type,
path: `${path_base_main}`
}
}
}
}
throwError(`未找到key=${key}的配置`)
}
@@ -700,7 +629,7 @@ async function openKnapsack() {
*/
async function templateMatchHolyRelicsKnapsack() {
let ms = 600
let saint_relic_backpack_selected = getJsonPath('saint_relic_backpack_selected',false)
let saint_relic_backpack_selected = getJsonPath('saint_relic_backpack_selected', false)
let templateJson = {
path_base: saint_relic_backpack_selected.path,
text: saint_relic_backpack_selected.name, // 要识别的文本内容,即"圣遗物"三个字
@@ -1095,7 +1024,7 @@ async function openUpSort() {
let width = Math.floor(genshinJson.width / 3.0);
// 获取屏幕高度
let height = Math.floor(genshinJson.height);
let ascending_order_not_selected = getJsonPath('ascending_order_not_selected',false)
let ascending_order_not_selected = getJsonPath('ascending_order_not_selected', false)
let templateJson = {
path_base: ascending_order_not_selected.path,
text: ascending_order_not_selected.name,
@@ -1138,7 +1067,7 @@ async function openLvSort() {
let width = Math.floor(genshinJson.width / 3.0);
// 获取屏幕高度
let height = Math.floor(genshinJson.height);
let level_sort = getJsonPath('level_sort',false)
let level_sort = getJsonPath('level_sort', false)
// 使用OCR识别指定区域的图像
let templateJson = {
path_base: level_sort.path,
@@ -1510,12 +1439,12 @@ async function ocrAttributeHolyRelic() {
}
let subName = subList[index] + "";
let subValue = subVRes.text + "";
let key = '(待激活)'
let key = mana.get('toBeActivated')
if (subName.includes(key)) {
subName = key + subName.split(key)[0].trim()
}
if (AttributeHolyRelickeys.includes(subName) && subValue.includes('%')) {
subName = subName + '百分比'
subName = subName + mana.get('percentage')
}
holyRelicAttribute.sub.push({name: subName, value: subValue})
await logInfoTemplate(subVRes)
@@ -1546,7 +1475,7 @@ async function resetAttributeSort(log_off = config.log_off) {
await scrollPageByAttributeSortInit()
await wait()
// let template_name = '属性排序规则'
let attribute_sort_rules = getJsonPath('attribute_sort_rules',false)
let attribute_sort_rules = getJsonPath('attribute_sort_rules', false)
let templateJson = {
path_base: attribute_sort_rules.path,
text: attribute_sort_rules.name,
@@ -1619,7 +1548,7 @@ async function attributeSort(keyword = config.sortAttribute, source = 'attribute
// await wait(100)
// let template_name = '属性排序规则'
let attribute_sort_rules = getJsonPath('attribute_sort_rules',false)
let attribute_sort_rules = getJsonPath('attribute_sort_rules', false)
let width = Math.floor(450 * genshinJson.width / 1920);
let templateJson = {
@@ -1895,7 +1824,7 @@ async function clickProgressBarTopByHolyRelics() {
// await confirm('强制拉到顶')
let siftJson= getJsonPath('sift')
let siftJson = getJsonPath('sift')
let templateMatchJson = {
text: siftJson.name,
type: siftJson.type,
@@ -2015,7 +1944,7 @@ async function openAggrandizement() {
// // 捕获游戏区域并查找强化按钮
// let aggrandizement = captureGameRegion().find(aggrandizementRo);
// 定义OCR识别的JSON对象包含文本和位置信息
let strengthen = getJsonPath('strengthen',false)
let strengthen = getJsonPath('strengthen', false)
let templateJson = {
text: strengthen.name,
type: strengthen.type,
@@ -2068,8 +1997,8 @@ async function confirm(log_msg = '点击确认', source = 'confirm') {
*/
async function clear(source = 'clear') {
// 通过OCR识别并点击"详情"按钮
let info = getJsonPath('info',false)
let strengthen = getJsonPath('strengthen',false)
let info = getJsonPath('info', false)
let strengthen = getJsonPath('strengthen', false)
let json = {
text: info.name,
type: info.type,
@@ -2095,7 +2024,7 @@ async function clear(source = 'clear') {
async function operateDispose(operate, enableInsertionMethod, source = 'operateDispose', log_off) {
let ms = 600
// let templateMatch_name = '阶段放入' // 默认使用"阶段放入"进行OCR识别
let stage_put_in = getJsonPath('stage_put_in',false)
let stage_put_in = getJsonPath('stage_put_in', false)
let templateJson = {
text: stage_put_in.name,
type: stage_put_in.type,
@@ -2105,7 +2034,7 @@ async function operateDispose(operate, enableInsertionMethod, source = 'operateD
width: genshinJson.width,
height: genshinJson.height
}
let templateMatch_name=templateJson.text
let templateMatch_name = templateJson.text
//自动识别界面元素
let templateMatch1 = await templateMatchFindByJson(templateJson)
// 如果默认元素不存在,则切换为"快捷放入"
@@ -2360,7 +2289,7 @@ async function upOperate(operate, source = 'upOperate', log_off) {
await wait(ms)
// 定义错误信息为"摩拉不足"
// let err = '摩拉不足'
let morra_is_not_enough = getJsonPath('morra_is_not_enough',false)
let morra_is_not_enough = getJsonPath('morra_is_not_enough', false)
let errJson = {
text: morra_is_not_enough.name,
path_base: morra_is_not_enough.path,
@@ -2771,8 +2700,8 @@ async function examine() {
cont: false,
msg: ''
}
let consecration_oil_paste = getJsonPath('consecration_oil_paste',false)
let consecration_essence = getJsonPath('consecration_essence',false)
let consecration_oil_paste = getJsonPath('consecration_oil_paste', false)
let consecration_essence = getJsonPath('consecration_essence', false)
let five_star_json = getJsonPath('five_star');
//检查

View File

@@ -1,4 +1,17 @@
[
{
"name": "language",
"type": "select",
"label": "语言|語言|Language|言語|언어",
"options": [
"简体中文",
"繁體中文",
"English",
"日本語",
"한국어",
],
"default": "简体中文"
},
{
"name": "toBag",
"type": "checkbox",
@@ -212,7 +225,7 @@
{
"name": "log_off",
"type": "checkbox",
"label": "日志开关(用于开发者调试)",
"label": "日志开关(用于开发者调试-日志输出为中文)",
"default": false
}
]

View File

@@ -0,0 +1,102 @@
function info(msg, must = false,log_off=false) {
if (log_off || must) {
log.info(msg)
}
}
function warn(msg, must = false,log_off=false) {
if (log_off || must) {
log.warn(msg)
}
}
function debug(msg, must = false,log_off=false) {
if (log_off || must) {
log.debug(msg)
}
}
function error(msg, must = false,log_off=false) {
if (log_off || must) {
log.error(msg)
}
}
function throwError(msg) {
notification.error(`${msg}`);
}
function openCaptureGameRegion() {
return captureGameRegion()
}
function closeCaptureGameRegion(region) {
region.Dispose()
}
function findByCaptureGameRegion(region, templateMatchObject) {
return region.find(templateMatchObject)
}
function findMultiByCaptureGameRegion(region, templateMatchObject) {
return region.findMulti(templateMatchObject)
}
function mTo(x, y) {
moveMouseTo(x, y);
}
function recognitionObjectOcr(x, y, width, height) {
return RecognitionObject.Ocr(x, y, width, height)
}
function downLeftButton() {
leftButtonDown();
}
function upLeftButton() {
leftButtonUp();
}
function moveByMouse(x, y) {
moveMouseBy(x, y);
}
async function wait(ms = 1000) {
// 等待300毫秒确保按下操作生效
await sleep(ms);
}
function downClick(x, y) {
click(x, y);
}
/**
* 检查资源是否存在
* @param {Object} res - 需要检查的资源对象
* @returns {Boolean} 返回资源是否存在的结果
* true表示资源存在false表示资源不存在
*/
function isExist(res) {
return res.isExist() // 调用资源对象的isExist方法获取存在状态
}
this.holyRelicsUpUtils = {
isExist,
info,
warn,
debug,
error,
throwError,
openCaptureGameRegion,
closeCaptureGameRegion,
findByCaptureGameRegion,
findMultiByCaptureGameRegion,
mTo,
recognitionObjectOcr,
downLeftButton,
upLeftButton,
moveByMouse,
wait,
downClick
};

View File

@@ -0,0 +1,121 @@
function getLanguageMsgMap() {
let LanguageMsgMap = new Map([
['简体中文', '未找到[language-key]语言配置,支持语言:[languageList-key]'],
['繁體中文', '未找到[language-key]語言配置,支持語言:[languageList-key]'],
['日本語', '[language-key]の言語設定が見つかりません。サポートされている言語:[languageList-key]'],
['한국어', '[language-key] 언어 구성을 찾을 수 없습니다. 지원 언어: [languageList-key]'],
['English', 'Language configuration for [language-key] not found. Supported languages: [languageList-key]'],
])
return LanguageMsgMap
}
function getLanguageMap() {
let LanguageMap = new Map([
['简体中文', 'zh-cn']
])
return LanguageMap
}
function getLanguageALLConfigMap() {
//key 值为 ./assets/language 下的语言 文件夹 value为配置json
let LanguageALLConfigMap = new Map([
['zh-cn',
{
attributeMap: new Map([
['%', '百分比'],
['生命', '生命值'],
['防御', '防御力'],
['攻击', '攻击力'],
['暴率', '暴击率'],
['爆率', '暴击率'],
['暴伤', '暴击伤害'],
['爆伤', '暴击伤害'],
['物伤', '物理伤害加成'],
['风伤', '风元素伤害加成'],
['水伤', '水元素伤害加成'],
['雷伤', '雷元素伤害加成'],
['岩伤', '岩元素伤害加成'],
['草伤', '草元素伤害加成'],
['冰伤', '冰元素伤害加成'],
['火伤', '火元素伤害加成'],
['治疗', '治疗加成'],
['精通', '元素精通'],
['充能', '元素充能效率'],
]),
attributeList: [
'物理伤害加成'
, '风元素伤害加成'
, '水元素伤害加成'
, '雷元素伤害加成'
, '岩元素伤害加成'
, '草元素伤害加成'
, '冰元素伤害加成'
, '火元素伤害加成'
, '治疗加成'
// , '元素精通'
// , '元素充能效率'
],
attributeFixedMap: new Map([
['生之花', ['生命值']],
['死之羽', ['攻击力']],
]),
attributeHolyRelickeys: ['生命值', '防御力', '攻击力'],
holyRelicPartsAsMap: new Map([
['花', '生之花'],
['羽', '死之羽'],
['羽毛', '死之羽'],
['冠', '理之冠'],
['沙', '时之沙'],
['杯', '空之杯'],
['杯子', '空之杯'],
]),
holyRelicParts: ['生之花', '死之羽', '理之冠', '时之沙', '空之杯'],
//languageMap 不同语言请保持 key值不变
languageMap: new Map([
// ['ascending_order', {name: '升序', type: '.jpg'}],
['attribute_sort_rules', {name: '属性排序规则', type: '.jpg'}],
['filtered', {name: '已经筛选', type: '.jpg'}],
['saint_relic_backpack_selected', {name: '已选中圣遗物背包', type: '.jpg'}],
// ['open_the_function', {name: '开启阶段放入功能', type: '.jpg'}],
['strengthen', {name: '强化', type: '.jpg'}],
// ['quickly_put_in', {name: '快捷放入', type: '.jpg'}],
['stage_put_in', {name: '阶段放入', type: '.jpg'}],
['morra_is_not_enough', {name: '摩拉不足', type: '.jpg'}],
['ascending_order_not_selected', {name: '未选中升序1', type: '.jpg'}],
['consecration_oil_paste', {name: '祝圣油膏', type: '.jpg'}],
['consecration_essence', {name: '祝圣精华', type: '.jpg'}],
['level_sort', {name: '等级顺序排序', type: '.jpg'}],
// ['level_not_max', {name: '筛选未满级', type: '.jpg'}],
['info', {name: '详情', type: '.jpg'}],
// ['up_materials_select', {name: '请选择升级材料', type: '.jpg'}],
// ['morra_need', {name: '需要摩拉', type: '.jpg'}],
]),
//魔法值 不同语言请保持 key值不变
mana: new Map([
['holyRelicsNoMax', '未满级'],
['holyRelicsLockMark', '标记'],
['holyRelicsLockY', '仅锁定'],
['holyRelicsLockN', '未锁定'],
['holyRelicsEquipY', '已装备'],
['holyRelicsEquipN', '未装备'],
['holyRelicsSourceFrostSaint', '祝圣之霜定义'],
['desc_order', '降序'],
['asc_order', '升序'],
['quality_order', '品质顺序'],
['percentage', '百分比'],
['toBeActivated', '(待激活)']
]),
}
],
])
return LanguageALLConfigMap
}
this.languageUtils = {
getLanguageMap,
getLanguageALLConfigMap,
getLanguageMsgMap,
};