Merge pull request #251 from navidmafi/main

fix(web): standardize utils/game.ts for cross-platform (needs windows test)
This commit is contained in:
Thoronium
2025-11-27 00:33:36 -07:00
committed by GitHub

View File

@@ -1,110 +1,34 @@
import { invoke } from '@tauri-apps/api'
import { getConfig } from './configuration'
import { basename, dirname, join } from '@tauri-apps/api/path'
import { getConfigOption } from './configuration'
export const getGrasscutterJar = () => getConfigOption('grasscutter_path')
export async function getGameExecutable() {
const config = await getConfig()
if (!config.game_install_path) {
return null
}
const pathArr = config.game_install_path.replace(/\\/g, '/').split('/')
return pathArr[pathArr.length - 1]
}
export async function getGrasscutterJar() {
const config = await getConfig()
if (!config.grasscutter_path) {
return null
}
const pathArr = config.grasscutter_path.replace(/\\/g, '/').split('/')
return pathArr[pathArr.length - 1]
}
export async function getGameFolder() {
const config = await getConfig()
if (!config.game_install_path) {
return null
}
const pathArr = config.game_install_path.replace(/\\/g, '/').split('/')
pathArr.pop()
const path = pathArr.join('/')
return path
}
export async function getGameDataFolder() {
const gameExec = await getGameExecutable()
if (!gameExec) {
return null
}
return (await getGameFolder()) + '\\' + gameExec.replace('.exe', '_Data')
}
const exe_path = await getConfigOption('game_install_path')
return await basename(exe_path)
}
export async function getGameVersion() {
const GameData = await getGameDataFolder()
const platform = await invoke('get_platform')
if (!GameData) {
return null
}
let hasAsb = await invoke('dir_exists', {
path: GameData + '\\StreamingAssets\\asb_settings.json',
})
if (platform != 'windows') {
hasAsb = await invoke('dir_exists', {
path: GameData + '/StreamingAssets/asb_settings.json',
})
}
const execPath = await getConfigOption('game_install_path')
const rootPath = await dirname(execPath)
const baseName = (await basename(execPath, ".exe"))
const datapath = await join(rootPath, `${baseName}_Data`)
const asbPath = await join(datapath, 'StreamingAssets', 'asb_settings.json')
const hasAsb = await invoke<boolean>('dir_exists', { path: asbPath })
if (!hasAsb) {
// For games that cannot determine game version
let otherGameVer: string = await invoke('read_file', {
path: GameData + '\\StreamingAssets\\BinaryVersion.bytes',
})
const versionFile = await join(datapath, 'StreamingAssets', 'BinaryVersion.bytes')
const rawVersion = await invoke<string>('read_file', { path: versionFile })
if (!rawVersion) return null
if (platform != 'windows') {
otherGameVer = await invoke('read_file', {
path: GameData + '/StreamingAssets/BinaryVersion.bytes',
})
}
const versionRaw = otherGameVer.split('.')
const version = {
major: parseInt(versionRaw[0]),
minor: parseInt(versionRaw[1]),
// This will probably never matter, just use major/minor. If needed, full version values are near EOF
release: 0,
}
if (otherGameVer == null || otherGameVer.length < 1) {
return null
}
return version
const [major, minor] = rawVersion.split('.').map(Number)
return { major, minor, release: 0 }
}
const settings = JSON.parse(
await invoke('read_file', {
path: GameData + '\\StreamingAssets\\asb_settings.json',
})
)
const settings = JSON.parse(await invoke<string>('read_file', { path: asbPath }))
const [major, minorRelease] = settings.variance.split('.')
const [minor, release] = minorRelease.split('_').map(Number)
const versionRaw = settings.variance.split('.')
const version = {
major: parseInt(versionRaw[0]),
minor: parseInt(versionRaw[1].split('_')[0]),
release: parseInt(versionRaw[1].split('_')[1]),
}
return version
return { major: parseInt(major), minor, release }
}