diff --git a/src/Zemu.ts b/src/Zemu.ts index c3f0dc1..f61e59c 100644 --- a/src/Zemu.ts +++ b/src/Zemu.ts @@ -55,6 +55,7 @@ import { ClickNavigation, scheduleToNavElement, TouchNavigation } from "./action import { getTouchElement } from "./buttons"; import { ActionKind, + areEventsEqual, ButtonKind, SwipeDirection, type IButton, @@ -93,6 +94,7 @@ export default class Zemu { public mainMenuSnapshot!: ISnapshot; public initialEvents!: IEvent[]; + private searchedEvents: IEvent[] = []; constructor( elfPath: string, @@ -124,6 +126,7 @@ export default class Zemu { this.containerName = BASE_NAME + rndstr.generate(8); this.emuContainer = new EmuContainer(this.elfPath, this.libElfs, emuImage, this.containerName); + this.searchedEvents = []; } static LoadPng2RGB(filename: string): PNGWithMetadata { @@ -711,11 +714,28 @@ export default class Zemu { imageIndex += 1; filename = this.getSnapshotPath(snapshotPrefixTmp, imageIndex, takeSnapshots); - found = events.some((event: IEvent) => textRegex.test(event.text)); - if (found) break; + for (let i = 0; i < this.searchedEvents.length; i++) { + if (!areEventsEqual(this.searchedEvents[i], events[i])) { + this.searchedEvents = []; + break; + } + } + + const nonSearchedEvents = events.slice(this.searchedEvents.length); - const nav: INavElement = { - type: touchDevice ? ActionKind.Touch : ActionKind.RightClick, + for (const event of nonSearchedEvents) { + this.searchedEvents.push(event); + if (textRegex.test(event.text)) { + found = true; + break; + } + } + + if (found) + break; + + const nav: INavElement = { + type: touchDevice ? ActionKind.Touch : ActionKind.RightClick, button: imageIndex === 1 && isBlindSigning ? getTouchElement(this.startOptions.model, ButtonKind.RejectButton) diff --git a/src/types.ts b/src/types.ts index b287517..40f4674 100644 --- a/src/types.ts +++ b/src/types.ts @@ -34,6 +34,16 @@ export interface IEvent { h: number; clear: boolean; } + +export function areEventsEqual(event1: IEvent, event2: IEvent): boolean { + return event1.text === event2.text && + event1.x === event2.x && + event1.y === event2.y && + event1.w === event2.w && + event1.h === event2.h && + event1.clear === event2.clear; +} + export interface ISwipeCoordinates { x: number; y: number;