|
220 | 220 | } |
221 | 221 | } |
222 | 222 |
|
| 223 | + // 新增:判断队内角色函数(新知识+1) |
| 224 | + async function includes(characterName) { |
| 225 | + var avatars = getAvatars(); |
| 226 | + for (let i = 0; i < avatars.length; i++) { |
| 227 | + if (avatars[i] === characterName) { return true; } |
| 228 | + } |
| 229 | + return false; |
| 230 | + } |
| 231 | + |
223 | 232 | //切换队伍 |
224 | 233 | async function switchPartyIfNeeded(partyName) { |
225 | | - if (!partyName) { |
226 | | - await genshin.returnMainUi(); |
227 | | - return; |
228 | | - } |
229 | 234 | try { |
230 | | - log.info("正在尝试切换至" + partyName); |
231 | 235 | if (!await genshin.switchParty(partyName)) { |
232 | 236 | log.info("切换队伍失败,前往七天神像重试"); |
233 | 237 | await genshin.tpToStatueOfTheSeven(); |
234 | | - await genshin.switchParty(partyName); |
| 238 | + return await genshin.switchParty(partyName); |
235 | 239 | } |
| 240 | + return true; |
236 | 241 | } catch { |
237 | 242 | log.error("队伍切换失败,可能处于联机模式或其他不可切换状态"); |
238 | 243 | notification.error(`队伍切换失败,可能处于联机模式或其他不可切换状态`); |
239 | 244 | await genshin.returnMainUi(); |
| 245 | + return false; |
240 | 246 | } |
241 | 247 | } |
242 | 248 |
|
243 | 249 | // 传送并进入副本 |
244 | 250 | async function fuben() { |
245 | | - await genshin.tp(-887.193359375, 1679.44287109375); |
246 | | - |
247 | | - await switchPartyIfNeeded(party); |
248 | | - |
249 | | - let ifynf = await textOCR("伊涅芙", 3, 0, 0, 1670, 200, 120, 400); |
250 | | - if (!ifynf.found) { log.error("未识别到伊涅芙,请在设置中输入包含伊涅芙的队伍!"); return; } |
| 251 | + // 先判断一次,队伍里有伊涅芙就直接开始运行,没有的话就切换指定队伍 |
| 252 | + let ifynf = await includes("伊涅芙"); |
| 253 | + let ifswitch; |
| 254 | + if (!ifynf) { |
| 255 | + ifswitch = await switchPartyIfNeeded(party); |
| 256 | + if (!ifswitch) { log.error("未识别到指定队伍,请检查队伍名是否正确!"); return false; }//找不到指定队伍就直接报错停止 |
| 257 | + |
| 258 | + ifynf = await includes("伊涅芙"); |
| 259 | + if (!ifynf) { log.error("未识别到伊涅芙,请在设置中输入包含伊涅芙的队伍!"); return false; }//切换到指定队伍后再进行判定 |
| 260 | + } |
| 261 | + log.info("已检测到伊涅芙,即将开始后续动作……"); |
251 | 262 |
|
| 263 | + await genshin.tp(-887.193359375, 1679.44287109375);//沉眠之庭 |
252 | 264 | keyDown("w"); |
253 | 265 | await sleep(2500); |
254 | 266 | keyUp("w"); |
|
261 | 273 | leftButtonClick(); |
262 | 274 | await sleep(1500); |
263 | 275 |
|
264 | | - log.info("古又老师说让你先die一下"); |
| 276 | + log.info("古又老师说让你先die一下");//先降低点生命值避免满血弹窗 |
265 | 277 | keyDown("A"); |
266 | 278 | await sleep(3000); |
267 | 279 | keyUp("A"); |
268 | 280 | await sleep(3000); |
| 281 | + |
| 282 | + return true; |
269 | 283 | } |
270 | 284 |
|
271 | 285 | // 伊涅芙跳楼机 |
|
276 | 290 |
|
277 | 291 | //连续点击三次防止过期道具卡背包 |
278 | 292 | await click(970, 760); |
279 | | - await sleep(300); |
| 293 | + await sleep(100); |
280 | 294 | await click(970, 760); |
281 | | - await sleep(300); |
| 295 | + await sleep(100); |
282 | 296 | await click(970, 760); |
283 | 297 |
|
284 | 298 | log.info("猜猜为什么要连续点击这个位置呢~"); |
|
289 | 303 | const ifshiwu = await textOCR("食物", 3, 0, 0, 126, 17, 99, 53); |
290 | 304 | if (!ifshiwu.found) { |
291 | 305 | await genshin.returnMainUi(); |
292 | | - log.warn("未打开'食物'页面"); |
293 | | - return; |
| 306 | + throw new Error("未打开'食物'页面,请确保背包已正确打开并切换到食物标签页"); |
294 | 307 | }//确认在食物界面 |
295 | 308 | await sleep(500); |
296 | 309 | const ifpingguo = await imageRecognitionEnhanced(pingguo, 1, 1, 0, 115, 120, 1150, 155);//识别"苹果"图片 |
297 | 310 | if (!ifpingguo.found) { |
298 | 311 | await genshin.returnMainUi(); |
299 | | - log.warn("没有找到指定的食物"); |
300 | | - return; |
| 312 | + throw new Error("没有找到指定的食物:" + food + "请检查背包中该食材数量是否足够!"); |
301 | 313 | } |
302 | 314 | await sleep(500); |
303 | 315 |
|
304 | | - await textOCR("使用", 5, 1, 0, 1620, 987, 225, 50); |
| 316 | + await click(1700, 1020);//点击使用 |
305 | 317 | await sleep(1000); |
306 | 318 |
|
307 | | - const ifzjz = await imageRecognitionEnhanced(zjz, 5, 1, 0, 625, 290, 700, 360, true); |
308 | | - await sleep(300); |
| 319 | + const ifzjz = await imageRecognitionEnhanced(zjz, 5, 1, 0, 625, 290, 700, 360, true);//点击伊涅芙证件照 |
| 320 | + await sleep(100); |
| 321 | + leftButtonClick();//连续点击确保吃食物的是伊涅芙 |
| 322 | + await sleep(100); |
309 | 323 | leftButtonClick(); |
310 | | - await sleep(300); |
311 | | - leftButtonClick(); |
312 | | - await sleep(300); |
| 324 | + await sleep(100); |
313 | 325 |
|
314 | | - if (!ifzjz.found) { log.error("未识别到伊涅芙"); return; } |
| 326 | + if (!ifzjz.found) { throw new Error("未识别到伊涅芙"); } |
315 | 327 |
|
316 | 328 | for (let i = 0; i < foodCount; i++) { |
317 | 329 | click(1251, 630); |
318 | | - await sleep(300); |
| 330 | + await sleep(150); |
319 | 331 | } |
320 | 332 |
|
321 | | - await textOCR("确认", 5, 1, 0, 1100, 740, 225, 50); |
| 333 | + await click(1180, 770);//点击确认 |
322 | 334 | await sleep(500); |
323 | 335 |
|
324 | 336 | await sleep(1000); |
325 | 337 | await keyPress("ESCAPE"); |
326 | 338 | await sleep(1000); |
327 | 339 | await keyPress("ESCAPE"); |
328 | 340 |
|
| 341 | + await sleep(1000); |
| 342 | + |
| 343 | + if (n == 1) { return; } |
| 344 | + |
329 | 345 | log.info("再见了伊涅芙,希望你喜欢这几分钟的戏份"); |
330 | 346 |
|
331 | | - await sleep(1000); |
332 | 347 | keyDown("A"); |
333 | 348 | await sleep(3000); |
334 | 349 | keyUp("A"); |
335 | 350 | await sleep(3000); |
336 | 351 | } |
337 | 352 |
|
338 | | - log.warn("使用前请仔细阅读readme并进行相关设置!"); |
339 | | - log.warn("请确保食材充足!"); |
| 353 | + |
| 354 | + // ===== MAIN EXECUTION ===== |
| 355 | + |
| 356 | + |
| 357 | + // 预处理 |
| 358 | + const party = settings.n;//设置好要切换的队伍 |
| 359 | + const food = settings.food;//设置要吃的食物 |
| 360 | + const foodCount = settings.foodNumber - 1;//点击“+”的次数,比食物数量少1 |
| 361 | + const n = settings.runNumber;//运行次数 |
| 362 | + |
| 363 | + const pingguo = `assets/${food}.png`;//食物图片路径 |
| 364 | + const zjz = `assets/zhengjianzhao.png`;//伊涅芙证件照 |
| 365 | + |
| 366 | + // 添加验证 |
| 367 | + if (!party) { log.error("队伍名为空,请仔细阅读readme并进行设置后再使用此脚本!"); return; }// 利用队伍是否为空判断用户有没有进行设置 |
| 368 | + if (foodCount > 98 || foodCount < 0) { log.error("食材数量请填写1-99之间的数字!"); return; }//确保食材数量1~99 |
| 369 | + if (n <= 0) { log.error("不是哥们,运行次数还能小于0???"); return; }//确保运行次数合法 |
| 370 | + |
340 | 371 |
|
341 | 372 | //设置分辨率和缩放 |
342 | 373 | setGameMetrics(1920, 1080, 1); |
343 | | - await genshin.returnMainUi(); |
| 374 | + await genshin.returnMainUi();//回到主界面,在秘境中可能会卡几秒 |
344 | 375 |
|
345 | | - const food = settings.food; |
346 | | - const party = settings.n; |
347 | | - const n = settings.runNumber; |
348 | | - const foodCount = settings.foodNumber - 1; |
349 | | - const pingguo = `assets/${food}.png`; |
350 | | - const zjz = `assets/zhengjianzhao.png`; |
| 376 | + log.warn("使用前请仔细阅读readme并进行相关设置!"); |
| 377 | + log.warn("请确保食材充足!"); |
351 | 378 |
|
352 | | - await fuben(); |
| 379 | + const iffuben = await fuben(); if (!iffuben) { return; }//前期准备,进入副本并降低一部分血量 |
353 | 380 |
|
| 381 | + // 循环控制运行次数 |
354 | 382 | try { |
355 | 383 | for (let i = 0; i < n; i++) { |
356 | 384 | await doit(); |
357 | 385 | } |
358 | 386 | } catch (error) { |
359 | 387 | log.error(`识别图像时发生异常: ${error.message}`); |
360 | 388 | } |
| 389 | + log.info("运行结束!今天的" + food + "味道不错哦~"); |
361 | 390 |
|
362 | 391 | await genshin.tpToStatueOfTheSeven(); |
363 | | - |
364 | 392 | })(); |
365 | | - |
366 | | - |
|
0 commit comments