@@ -5,7 +5,7 @@
* This file is automatically generated and should not be edited.
*/
// node_modules/.pnpm/@bettergi+utils@0.1.19 /node_modules/@bettergi/utils/dist/workflow.js
// node_modules/.pnpm/@bettergi+utils@0.1.25 /node_modules/@bettergi/utils/dist/workflow.js
var defaultMaxAttempts = 5 ;
var defaultRetryInterval = 1e3 ;
var waitForAction = async ( condition , retryAction , options ) => {
@@ -33,7 +33,7 @@ var waitForRegionDisappear = async (regionProvider, retryAction, options) => {
} , retryAction , options ) ;
} ;
// node_modules/.pnpm/@bettergi+utils@0.1.19 /node_modules/@bettergi/utils/dist/asserts.js
// node_modules/.pnpm/@bettergi+utils@0.1.25 /node_modules/@bettergi/utils/dist/asserts.js
var assertRegionAppearing = async ( regionProvider , message , retryAction , options ) => {
const isAppeared = await waitForRegionAppear ( regionProvider , retryAction , options ) ;
if ( ! isAppeared ) {
@@ -47,7 +47,7 @@ var assertRegionDisappearing = async (regionProvider, message, retryAction, opti
}
} ;
// node_modules/.pnpm/@bettergi+utils@0.1.19 /node_modules/@bettergi/utils/dist/exception.js
// node_modules/.pnpm/@bettergi+utils@0.1.25 /node_modules/@bettergi/utils/dist/exception.js
var getErrorMessage = ( err ) => {
if ( err && "message" in err && typeof err . message === "string" )
return err . message ;
@@ -57,22 +57,22 @@ var isHostException = (err) => {
return err && "hostException" in err ;
} ;
// node_modules/.pnpm/@bettergi+utils@0.1.19 /node_modules/@bettergi/utils/dist/mouse.js
var simulateScroll = async ( scrollAmountInClicks , times ) => {
// node_modules/.pnpm/@bettergi+utils@0.1.25 /node_modules/@bettergi/utils/dist/mouse.js
var simulateScroll = async ( wheelDelta , times ) => {
const script = {
macroEvents : Array ( times ) . fill ( { type : 6 , mouseX : 0 , mouseY : scrollAmountInClicks , time : 0 } ) ,
macroEvents : Array ( times ) . fill ( { type : 6 , mouseX : 0 , mouseY : wheelDelta , time : 0 } ) ,
info : { name : "" , description : "" , x : 0 , y : 0 , width : 1920 , height : 1080 , recordDpi : 1.5 }
} ;
await keyMouseScript . run ( JSON . stringify ( script ) ) ;
} ;
var mouseScrollDown = ( height , algorithm = ( h ) => Math . floor ( h / 18 ) ) => {
var mouseScrollDown = ( height , algorithm = ( h ) => Math . floor ( h / 17.9795 ) ) => {
return simulateScroll ( - 120 , algorithm ( height ) ) ;
} ;
var mouseScrollDownLines = ( lines , lineHeight = 175 ) => {
return mouseScrollDown ( lines * lineHeight ) ;
} ;
// node_modules/.pnpm/@bettergi+utils@0.1.19 /node_modules/@bettergi/utils/dist/ocr.js
// node_modules/.pnpm/@bettergi+utils@0.1.25 /node_modules/@bettergi/utils/dist/ocr.js
var findImageWithinBounds = ( image , x , y , w , h , config = { } ) => {
const ir = captureGameRegion ( ) ;
try {
@@ -89,7 +89,7 @@ var findImageWithinBounds = (image, x, y, w, h, config = {}) => {
ir . dispose ( ) ;
}
} ;
var findFirst = ( ir , ro , predicate ) => {
var findFirstRegion = ( ir , ro , predicate ) => {
const candidates = ir . findMulti ( ro ) ;
for ( let i = 0 ; i < candidates . count ; i ++ ) {
if ( predicate ( candidates [ i ] ) )
@@ -97,19 +97,21 @@ var findFirst = (ir, ro, predicate) => {
}
return void 0 ;
} ;
var findTextWithinBounds = ( text , x , y , w , h , options , config = { } ) => {
var textMatch = ( text , searchText , options ) => {
const { ignoreCase = true , contains = false } = options || { } ;
const searchT ext = ignoreCase ? text . toLowerCase ( ) : text ;
t ext = ignoreCase ? text . toLowerCase ( ) : text ;
searchText = ignoreCase ? searchText . toLowerCase ( ) : searchText ;
return contains ? text . includes ( searchText ) : text === searchText ;
} ;
var findTextWithinBounds = ( text , x , y , w , h , options , config = { } ) => {
const ir = captureGameRegion ( ) ;
try {
const ro = RecognitionObject . ocr ( x , y , w , h ) ;
if ( Object . keys ( config ) . length > 0 ) {
Object . assign ( ro , config ) && ro . initTemplate ( ) ;
}
return findFirst ( ir , ro , ( region ) => {
const itemText = ignoreCase ? region . text . toLowerCase ( ) : reg ion. text ;
const isMatch = contains ? itemText . includes ( searchText ) : itemText === searchText ;
return isMatch && region . isExist ( ) ;
return findFirstRegion ( ir , ro , ( region ) => {
return region . isExist ( ) && textMatch ( region . text , text , opt ions ) ;
} ) ;
} catch ( err ) {
log . warn ( ` ${ err . message || err } ` ) ;
@@ -117,34 +119,61 @@ var findTextWithinBounds = (text, x, y, w, h, options, config = {}) => {
ir . dispose ( ) ;
}
} ;
var findText WithinListView = async ( text , listView , match Options, retryOptions , config = { } ) => {
var findWithinListView = async ( condition , listView , retry Options, sampling , threshold = 0.9 ) => {
const { x , y , w , h , lineHeight , scrollLines = 1 , paddingX = 10 , paddingY = 10 } = listView ;
const { maxAttempts = 30 , retryInterval = 1e3 } = retryOptions || { } ;
const findTargetText = ( ) => findTextWithinBounds ( text , x , y , w , h , matchOptions , config ) ;
let lastTextRegion ;
const isReachedBottom = ( ) => {
const textRegion = findFirst ( captureGameRegion ( ) , RecognitionObject . ocr ( x , y , w , h ) , ( region ) => {
return region . isExist ( ) && region . text . trim ( ) . length > 0 ;
} ) ;
if ( textRegion ) {
if ( lastTextRegion ? . text === textRegion . text && Math . abs ( textRegion . y - lastTextRegion . y ) < lineHeight ) {
const { maxAttempts = 99 , retryInterval = 1200 } = retryOptions || { } ;
sampling ? ? = ( r ) => r . deriveCrop ( 1 , r . height * 0.5 , r . width - 1 , r . height * 0.5 ) ;
const captureListViewRegion = ( ) => captureGameRegion ( ) . deriveCrop ( x , y , w , h ) ;
const isReachedBottom = /* @__PURE__ */ ( ( ) => {
let lastCaptured ;
return ( ) => {
const newRegion = captureListViewRegion ( ) ;
if ( ! newRegion ? . isExist ( ) )
return true ;
} else {
lastTextRegion = textRegion ;
return false ;
try {
if ( ! lastCaptured )
return false ;
const oldRegion = sampling ( lastCaptured ) ;
if ( ! oldRegion ? . isExist ( ) )
return true ;
const ro = RecognitionObject . templateMatch ( oldRegion . srcMat ) ;
ro . threshold = threshold ;
ro . use3Channels = true ;
ro . initTemplate ( ) ;
return newRegion . find ( ro ) ? . isExist ( ) ;
} finally {
lastCaptured = newRegion ;
}
}
return true ;
} ;
const isTextFoundOrBottomReached = await waitForAction ( ( ) => findTargetText ( ) != void 0 || isReachedBottom ( ) , async ( ) => {
} ;
} ) ( ) ;
let targetRegion ;
await waitForAction ( ( ) => {
targetRegion = condition ( captureListViewRegion ( ) ) ;
return targetRegion ? . isExist ( ) || isReachedBottom ( ) ;
} , async ( ) => {
moveMouseTo ( x + w - paddingX , y + paddingY ) ;
await sleep ( 50 ) ;
await mouseScrollDownLines ( scrollLines , lineHeight ) ;
} , { maxAttempts , retryInterval } ) ;
return isTextFoundOrBottomReached ? findTargetText ( ) : void 0 ;
if ( targetRegion ? . isExist ( ) ) {
const { item1 , item2 } = targetRegion . convertPositionToGameCaptureRegion ( 0 , 0 ) ;
Object . assign ( targetRegion , { x : item1 , y : item2 } ) ;
return targetRegion ;
}
} ;
var findTextWithinListView = async ( text , listView , matchOptions , retryOptions , config = { } , sampling , threshold = 0.9 ) => {
const ro = RecognitionObject . ocrThis ;
if ( Object . keys ( config ) . length > 0 ) {
Object . assign ( ro , config ) && ro . initTemplate ( ) ;
}
return findWithinListView ( ( lvr ) => {
return findFirstRegion ( lvr , ro , ( region ) => {
return region . isExist ( ) && textMatch ( region . text , text , matchOptions ) ;
} ) ;
} , listView , retryOptions , sampling , threshold ) ;
} ;
// node_modules/.pnpm/@bettergi+utils@0.1.19 /node_modules/@bettergi/utils/dist/misc.js
// node_modules/.pnpm/@bettergi+utils@0.1.25 /node_modules/@bettergi/utils/dist/misc.js
var deepMerge = ( ... objects ) => {
const isPlainObject = ( input ) => input ? . constructor === Object ;
return objects . reduce ( ( result , obj ) => {
@@ -156,7 +185,7 @@ var deepMerge = (...objects) => {
} , { } ) ;
} ;
// node_modules/.pnpm/@bettergi+utils@0.1.19 /node_modules/@bettergi/utils/dist/time.js
// node_modules/.pnpm/@bettergi+utils@0.1.25 /node_modules/@bettergi/utils/dist/time.js
var getNextDay4AM = ( ) => {
const now = /* @__PURE__ */ new Date ( ) ;
const result = new Date ( now ) ;
@@ -189,7 +218,7 @@ var formatDurationAsReadable = (duration) => {
return Object . entries ( parseDuration ( duration ) ) . filter ( ( [ , value ] ) => value > 0 ) . map ( ( [ unit , value ] ) => ` ${ value } ${ unit } ` ) . join ( " " ) ;
} ;
// node_modules/.pnpm/@bettergi+utils@0.1.19 /node_modules/@bettergi/utils/dist/progress.js
// node_modules/.pnpm/@bettergi+utils@0.1.25 /node_modules/@bettergi/utils/dist/progress.js
var ProgressTracker = class {
total = 0 ;
current = 0 ;
@@ -256,7 +285,7 @@ var ProgressTracker = class {
}
} ;
// node_modules/.pnpm/@bettergi+utils@0.1.19 /node_modules/@bettergi/utils/dist/store.js
// node_modules/.pnpm/@bettergi+utils@0.1.25 /node_modules/@bettergi/utils/dist/store.js
var useStore = ( name ) => {
const filePath = ` store/ ${ name } .json ` ;
const obj = ( ( ) => {
@@ -302,27 +331,27 @@ var useStore = (name) => {
return createProxy ( obj ) ;
} ;
var useStoreWithDefaults = ( name , defaults ) => {
const s tore2 = useStore ( name ) ;
Object . assign ( s tore2 , deepMerge ( defaults , s tore2 ) ) ;
return s tore2 ;
const newS tore = useStore ( name ) ;
Object . assign ( newS tore, deepMerge ( defaults , newS tore) ) ;
return newS tore;
} ;
// src/config.ts
//! 用户脚本设置
var userConfig = {
//! 每周任务相关设置
room : settings . room || "20134075027 " ,
playbacks : ( settings . playbacks || "通关回放1.json,通关回放2 .json" ) . replace ( /, /g , "," ) . split ( "," ) . map ( ( str ) => str . trim ( ) ) . filter ( Boolean ) ,
room : settings . room || "20031486040 " ,
playbacks : ( settings . playbacks || "美景音乐播放器结算 .json" ) . replace ( /, /g , "," ) . split ( "," ) . map ( ( str ) => str . trim ( ) ) . filter ( Boolean ) ,
expPerAttempt : Math . max ( 1 , Number ( settings . expPerAttempt || "20" ) ) ,
deleteStageSave : settings . deleteStageSave ? ? false ,
deleteStageSaveKeyword : settings . deleteStageSaveKeyword || "深渊100层 " ,
deleteStageSaveKeyword : settings . deleteStageSaveKeyword || "音乐播放 " ,
expWeeklyLimit : Math . max ( 1 , Number ( settings . expWeeklyLimit || "4000" ) ) ,
force : settings . force ? ? false ,
thisAttempts : Math . max ( 0 , Number ( settings . thisAttempts || "0" ) ) ,
//! 每日任务相关设置
dailyEnabled : settings . dailyEnabled ? ? false ,
dailyRooms : ( settings . dailyRooms || "24429042323,28644538672" ) . replace ( /, /g , "," ) . split ( "," ) . map ( ( str ) => str . trim ( ) ) . filter ( Boolean ) ,
dailyPlaybacks : ( settings . dailyPlaybacks || "通关回放1.json,通关回放2.json;6 0秒按1通关.json" ) . replace ( /, /g , "," ) . replace ( /; /g , ";" ) . split ( ";" ) . map ( ( str ) => str . trim ( ) ) . filter ( Boolean ) . reduce ( ( arr , room ) => {
dailyPlaybacks : ( settings . dailyPlaybacks || "通关回放1.json,通关回放2.json;4 0秒按1通关.json" ) . replace ( /, /g , "," ) . replace ( /; /g , ";" ) . split ( ";" ) . map ( ( str ) => str . trim ( ) ) . filter ( Boolean ) . reduce ( ( arr , room ) => {
const files = room . split ( "," ) . map ( ( str ) => str . trim ( ) ) . filter ( Boolean ) ;
if ( files . length > 0 ) arr . push ( files ) ;
return arr ;
@@ -355,7 +384,7 @@ var findBottomBtnText = (text, contains) => {
//! 通用:查找关闭对话框按钮
var findCloseDialog = ( ) => {
const img = "assets/UI_BtnIcon_Close.png" ;
const iro = findImageWithinBounds ( img , 48 0 , 2 16, 96 0, 648 , { useMask : true , threshold : 0.75 } ) ;
const iro = findImageWithinBounds ( img , 41 0 , 160 , 110 0, 660 , { useMask : true , threshold : 0.8 } ) ;
iro ? . drawSelf ( "group_img" ) ;
return iro ;
} ;
@@ -428,7 +457,7 @@ var findEnterRoomShortcut = () => {
//! 房间:查找退出房间按钮
var findLeaveRoomBtn = ( ) => {
const img = "assets/UI_Icon_Leave_Right.png" ;
const iro = findImageWithinBounds ( img , 1570 , 0 , 350 , 100 ) ;
const iro = findImageWithinBounds ( img , 1570 , 0 , 350 , 100 , { threshold : 0.8 } );
iro ? . drawSelf ( "group_img" ) ;
return iro ;
} ;
@@ -487,8 +516,8 @@ var findExternalSaveColumnPos = () => {
var findDeleteExternalSaveChecked = ( colPos ) => {
const img = "assets/Checkbox_Checked.png" ;
const iro = findImageWithinBounds ( img , colPos , 250 , 290 , 710 , {
threshold : 0.6 ,
use3Channels : fals e
threshold : 0.75 ,
use3Channels : tru e
} ) ;
iro ? . drawSelf ( "group_img" ) ;
return iro ;
@@ -542,7 +571,6 @@ var isInLobby = () => findBeyondHallBtn() !== void 0;
var isInTeyvat = ( ) => {
return findGachaBtn ( ) !== void 0 && findBeyondRecommendBtn ( ) !== void 0 ;
} ;
//! 从提瓦特前往公共大厅
//! 退出大厅返回提瓦特大陆
var exitLobbyToTeyvat = async ( ) => {
if ( ! userConfig . goToTeyvat ) return ;
@@ -637,7 +665,7 @@ var fetchCultivateReward = async () => {
keyPress ( "VK_F1" ) ;
await sleep ( 2e3 ) ;
if ( findHeaderTitle ( "盛邀" , true ) === void 0 ) {
keyPress ( "VK_E " ) ;
keyPress ( "VK_Q " ) ;
}
} ,
{ maxAttempts : 10 , retryInterval : 1e3 }
@@ -676,14 +704,16 @@ var goToRecommendedWonderlands = async () => {
//! 创建并进入奇域房间
var createRoom = async ( room ) => {
await goToRecommendedWonderlands ( ) ;
log . info ( "打开全部 奇域界面..." ) ;
log . info ( "打开搜索 奇域界面..." ) ;
await assertRegionAppearing (
( ) => findHeaderTitle ( "搜索" , true ) ,
"打开全部 奇域界面超时" ,
"打开搜索 奇域界面超时" ,
( ) => {
findAllWonderlandsBtn ( ) ? . click ( ) ;
}
) ;
//! 减少网络影响带来的影响
log . info ( "等待奇域列表加载完成..." ) ;
await sleep ( 1500 ) ;
//! 记录搜索前的第一个奇域名称
let iwnt ;
@@ -694,7 +724,7 @@ var createRoom = async (room) => {
await sleep ( 500 ) ;
wi += 1 ;
}
if ( iwnt === void 0 ) throw new Error ( "加载全部 奇域列表超时" ) ;
if ( iwnt === void 0 ) throw new Error ( "奇域列表加载 超时" ) ;
log . info ( "搜索前的第一个奇域名称: {iwnt}" , iwnt ) ;
log . info ( "粘贴奇域关卡文本: {room}" , room ) ;
await assertRegionAppearing ( findClearInputBtn , "粘贴关卡文本超时" , ( ) => {