Skip to content

Commit

Permalink
Update starrail pipeline to properly get skill data and image data lo…
Browse files Browse the repository at this point in the history
…cally (#2363)

* Use local images for starrail assets

* Remove overworld image

* Regenerate

* Fix somnia command

* Update pipeline to properly use AvatarSkillConfig and AvatarSkillTreeConfig

* Regenerate files

* Update more things

* Generate again

* Undo databank change
  • Loading branch information
nguyentvan7 authored Aug 7, 2024
1 parent be50346 commit 57ab203
Show file tree
Hide file tree
Showing 2,154 changed files with 53,789 additions and 25,649 deletions.
2 changes: 1 addition & 1 deletion apps/somnia/src/commands/databank/char.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ function skillEmbed(
}
const embed = baseEmbed(id, name).setDescription(clean(text))
const thumbnail = getAssets(id)[ability]
if (thumbnail) embed.setThumbnail(createYattaUrl('skill', thumbnail))
if (thumbnail) embed.setThumbnail(createYattaUrl('skill', thumbnail[0]))
return embed
}

Expand Down
1,765 changes: 1,243 additions & 522 deletions libs/sr/assets-data/src/AssetsData_gen.json

Large diffs are not rendered by default.

73 changes: 42 additions & 31 deletions libs/sr/assets-data/src/executors/gen-assets-data/executor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@ import type {
import {
avatarConfig,
avatarRankConfig,
avatarSkillConfig,
avatarSkillTreeConfig,
characterIdMap,
DmAttackTypeMap,
equipmentConfig,
lightConeIdMap,
relicDataInfo,
Expand All @@ -24,12 +26,12 @@ import type { GenAssetsDataExecutorSchema } from './schema'

type CharacterIcon = {
icon: string
basic: string
skill: string
ult: string
talent: string
technique: string
overworld: string
basic: string[]
skill: string[]
ult: string[]
talent: string[]
technique: string[]
overworld: string[]
bonusAbility1: string
bonusAbility2: string
bonusAbility3: string
Expand Down Expand Up @@ -84,42 +86,51 @@ const runExecutor: PromiseExecutor<GenAssetsDataExecutorSchema> = async (

// parse baseStat/ascension/basic data for characters.
Object.entries(avatarConfig).forEach(([avatarId, charData]) => {
const { DefaultAvatarHeadIconPath } = charData
const { DefaultAvatarHeadIconPath, SkillList } = charData
const [eidolon1, eidolon2, eidolon3, eidolon4, eidolon5, eidolon6] =
Object.values(avatarRankConfig[avatarId]).map((config) => config.IconPath)

const [
basic,
skill,
ult,
talent,
technique,
overworld,
_basic,
_skill,
_ult,
_talent,
_technique,
bonusAbility1,
bonusAbility2,
bonusAbility3,
] = Object.values(avatarSkillTreeConfig[avatarId]).map(
// Grab the first level; we just need the image names
(skillTree) => skillTree[0]
(skillTree) => skillTree[0].IconPath
)

const [e1, e2, e3, e4, e5, e6] = Object.values(avatarRankConfig[avatarId])

const assets: CharacterIcon = {
icon: DefaultAvatarHeadIconPath,
basic: basic.IconPath,
skill: skill.IconPath,
ult: ult.IconPath, // TODO: Maybe switch tot
talent: talent.IconPath,
technique: technique.IconPath,
overworld: overworld.IconPath,
bonusAbility1: bonusAbility1.IconPath,
bonusAbility2: bonusAbility2.IconPath,
bonusAbility3: bonusAbility3.IconPath,
eidolon1: e1.IconPath,
eidolon2: e2.IconPath,
eidolon3: e3.IconPath,
eidolon4: e4.IconPath,
eidolon5: e5.IconPath,
eidolon6: e6.IconPath,
basic: [],
skill: [],
ult: [],
talent: [],
technique: [],
overworld: [],
bonusAbility1,
bonusAbility2,
bonusAbility3,
eidolon1,
eidolon2,
eidolon3,
eidolon4,
eidolon5,
eidolon6,
}

SkillList.forEach((skillId) => {
// Grab the first level; we just need the image names
const { AttackType, SkillIcon } = avatarSkillConfig[skillId][0]
assets[AttackType ? DmAttackTypeMap[AttackType] : 'talent']?.push(
SkillIcon
)
})

assetData.chars[characterIdMap[avatarId]] = assets
})

Expand Down
2 changes: 1 addition & 1 deletion libs/sr/assets/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"gen-file": {
"executor": "@genshin-optimizer/sr/assets:gen-assets",
"options": {
"fetchAssets": "none"
"fetchAssets": "local"
},
"outputs": ["{workspaceRoot}/${projectRoot}/src/gen/**/*"],
"dependsOn": ["sr-assets-data:gen-file"]
Expand Down
103 changes: 67 additions & 36 deletions libs/sr/assets/src/executors/gen-assets/executor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,57 +35,50 @@ export default async function runExecutor(
console.log(options)
if (options.fetchAssets === 'local' && fs.existsSync(DM2D_PATH)) {
console.log('Copying files')
await crawlObject(
crawlObject(
AssetData,
[],
(s) => typeof s === 'string',
async (filePath: string, keys) => {
const fileName = keys.slice(-1)
(s) => typeof s === 'string' || Array.isArray(s),
(filePath: string | string[], keys) => {
const fileName = keys.slice(-1)[0]
const folderPath = keys.slice(0, -1).join('/')
copyFile(
`${DM2D_PATH}/${filePath.toLocaleLowerCase()}`,
`${DEST_PROJ_PATH}/gen/${folderPath}/${fileName}.png`
)
if (typeof filePath === 'string') {
copyFile(
`${DM2D_PATH}/${filePath.toLocaleLowerCase()}`,
`${DEST_PROJ_PATH}/gen/${folderPath}/${fileName}.png`
)
} else {
filePath.forEach((fp, index) =>
copyFile(
`${DM2D_PATH}/${fp.toLocaleLowerCase()}`,
`${DEST_PROJ_PATH}/gen/${folderPath}/${fileName}_${index}.png`
)
)
}
}
)
} else if (options.fetchAssets === 'yatta') {
console.log('Fetching from yatta.top')
await crawlObjectAsync(
AssetData,
[],
(s) => typeof s === 'string',
async (filePath: string, keys) => {
const fileName = keys.slice(-1)
(s) => typeof s === 'string' || Array.isArray(s),
async (filePath: string | string[], keys) => {
const fileName = keys.slice(-1)[0]
const subFolderPath = keys.slice(0, -1).join('/')
const yattaFileName = filePath.split('/').at(-1) ?? ''
const yatta = `https://api.yatta.top/hsr/assets/UI/skill/${yattaFileName}`
const destFolder = path.resolve(
`${DEST_PROJ_PATH}/gen/${subFolderPath}`
)
const destFile = path.resolve(`${destFolder}/${fileName}.png`)

if (!fs.existsSync(destFolder)) fs.mkdirSync(destFolder)

const filestream = fs.createWriteStream(destFile)

try {
const yattaImage = await fetch(yatta)
if (yattaImage.body === null) {
console.log(
`File body null for ${yatta} to be stored in ${destFile}`
)
return
}
await finished(
Readable.fromWeb(yattaImage.body as ReadableStream<any>).pipe(
filestream
if (typeof filePath === 'string') {
await saveFromYatta(filePath, destFolder, fileName)
} else {
await Promise.all(
filePath.map((fp, index) =>
saveFromYatta(fp, destFolder, `${fileName}_${index}`)
)
)
} catch (exception) {
console.log(
`Exception when fetching ${yatta} for ${destFile}: ${exception}`
)
throw exception
}
}
)
Expand All @@ -98,12 +91,50 @@ export default async function runExecutor(
crawlObject(
AssetData,
[],
(s) => typeof s === 'string',
(_filePath: string, keys) => {
(s) => typeof s === 'string' || Array.isArray(s),
(filePath: string | string[], keys) => {
const fileName = keys.slice(-1)[0]
layeredAssignment(indexData, keys, fileName)
if (typeof filePath === 'string') {
layeredAssignment(indexData, keys, fileName)
} else {
filePath.forEach((_, index) => {
const newKeys = [...keys]
newKeys[newKeys.length - 1] = `${
newKeys[newKeys.length - 1]
}_${index}`
layeredAssignment(indexData, newKeys, `${fileName}_${index}`)
})
}
}
)
await generateIndexFromObj(indexData, `${DEST_PROJ_PATH}/gen`)
return { success: true }
}

async function saveFromYatta(
filePath: string,
destFolder: string,
fileName: string
) {
const yattaFileName = filePath.split('/').at(-1) ?? ''
const yatta = `https://api.yatta.top/hsr/assets/UI/skill/${yattaFileName}`
const destFile = path.resolve(`${destFolder}/${fileName}.png`)

const filestream = fs.createWriteStream(destFile)

try {
const yattaImage = await fetch(yatta)
if (yattaImage.body === null) {
console.log(`File body null for ${yatta} to be stored in ${destFile}`)
return
}
await finished(
Readable.fromWeb(yattaImage.body as ReadableStream<any>).pipe(filestream)
)
} catch (exception) {
console.log(
`Exception when fetching ${yatta} for ${destFile}: ${exception}`
)
throw exception
}
}
Binary file removed libs/sr/assets/src/gen/chars/Acheron/basic.png
Binary file not shown.
Binary file added libs/sr/assets/src/gen/chars/Acheron/basic_0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified libs/sr/assets/src/gen/chars/Acheron/bonusAbility1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified libs/sr/assets/src/gen/chars/Acheron/bonusAbility2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified libs/sr/assets/src/gen/chars/Acheron/bonusAbility3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified libs/sr/assets/src/gen/chars/Acheron/eidolon1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified libs/sr/assets/src/gen/chars/Acheron/eidolon2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified libs/sr/assets/src/gen/chars/Acheron/eidolon3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified libs/sr/assets/src/gen/chars/Acheron/eidolon4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified libs/sr/assets/src/gen/chars/Acheron/eidolon5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified libs/sr/assets/src/gen/chars/Acheron/eidolon6.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 20 additions & 12 deletions libs/sr/assets/src/gen/chars/Acheron/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This is a generated index file.
import basic from './basic.png'
import basic_0 from './basic_0.png'
import bonusAbility1 from './bonusAbility1.png'
import bonusAbility2 from './bonusAbility2.png'
import bonusAbility3 from './bonusAbility3.png'
Expand All @@ -10,14 +10,18 @@ import eidolon4 from './eidolon4.png'
import eidolon5 from './eidolon5.png'
import eidolon6 from './eidolon6.png'
import icon from './icon.png'
import overworld from './overworld.png'
import skill from './skill.png'
import talent from './talent.png'
import technique from './technique.png'
import ult from './ult.png'
import overworld_0 from './overworld_0.png'
import skill_0 from './skill_0.png'
import talent_0 from './talent_0.png'
import technique_0 from './technique_0.png'
import ult_0 from './ult_0.png'
import ult_1 from './ult_1.png'
import ult_2 from './ult_2.png'
import ult_3 from './ult_3.png'
import ult_4 from './ult_4.png'

const data = {
basic,
basic_0,
bonusAbility1,
bonusAbility2,
bonusAbility3,
Expand All @@ -28,10 +32,14 @@ const data = {
eidolon5,
eidolon6,
icon,
overworld,
skill,
talent,
technique,
ult,
overworld_0,
skill_0,
talent_0,
technique_0,
ult_0,
ult_1,
ult_2,
ult_3,
ult_4,
} as const
export default data
Binary file removed libs/sr/assets/src/gen/chars/Acheron/overworld.png
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed libs/sr/assets/src/gen/chars/Acheron/skill.png
Binary file not shown.
Binary file added libs/sr/assets/src/gen/chars/Acheron/skill_0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed libs/sr/assets/src/gen/chars/Acheron/talent.png
Binary file not shown.
Binary file added libs/sr/assets/src/gen/chars/Acheron/talent_0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed libs/sr/assets/src/gen/chars/Acheron/technique.png
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed libs/sr/assets/src/gen/chars/Acheron/ult.png
Binary file not shown.
Binary file added libs/sr/assets/src/gen/chars/Acheron/ult_0.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added libs/sr/assets/src/gen/chars/Acheron/ult_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added libs/sr/assets/src/gen/chars/Acheron/ult_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added libs/sr/assets/src/gen/chars/Acheron/ult_3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added libs/sr/assets/src/gen/chars/Acheron/ult_4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed libs/sr/assets/src/gen/chars/Argenti/basic.png
Diff not rendered.
Binary file added libs/sr/assets/src/gen/chars/Argenti/basic_0.png
Binary file modified libs/sr/assets/src/gen/chars/Argenti/bonusAbility1.png
Binary file modified libs/sr/assets/src/gen/chars/Argenti/bonusAbility2.png
Binary file modified libs/sr/assets/src/gen/chars/Argenti/bonusAbility3.png
Binary file modified libs/sr/assets/src/gen/chars/Argenti/eidolon1.png
Binary file modified libs/sr/assets/src/gen/chars/Argenti/eidolon2.png
Binary file modified libs/sr/assets/src/gen/chars/Argenti/eidolon3.png
Binary file modified libs/sr/assets/src/gen/chars/Argenti/eidolon4.png
Binary file modified libs/sr/assets/src/gen/chars/Argenti/eidolon5.png
Binary file modified libs/sr/assets/src/gen/chars/Argenti/eidolon6.png
26 changes: 14 additions & 12 deletions libs/sr/assets/src/gen/chars/Argenti/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// This is a generated index file.
import basic from './basic.png'
import basic_0 from './basic_0.png'
import bonusAbility1 from './bonusAbility1.png'
import bonusAbility2 from './bonusAbility2.png'
import bonusAbility3 from './bonusAbility3.png'
Expand All @@ -10,14 +10,15 @@ import eidolon4 from './eidolon4.png'
import eidolon5 from './eidolon5.png'
import eidolon6 from './eidolon6.png'
import icon from './icon.png'
import overworld from './overworld.png'
import skill from './skill.png'
import talent from './talent.png'
import technique from './technique.png'
import ult from './ult.png'
import overworld_0 from './overworld_0.png'
import skill_0 from './skill_0.png'
import talent_0 from './talent_0.png'
import technique_0 from './technique_0.png'
import ult_0 from './ult_0.png'
import ult_1 from './ult_1.png'

const data = {
basic,
basic_0,
bonusAbility1,
bonusAbility2,
bonusAbility3,
Expand All @@ -28,10 +29,11 @@ const data = {
eidolon5,
eidolon6,
icon,
overworld,
skill,
talent,
technique,
ult,
overworld_0,
skill_0,
talent_0,
technique_0,
ult_0,
ult_1,
} as const
export default data
Binary file removed libs/sr/assets/src/gen/chars/Argenti/overworld.png
Diff not rendered.
Binary file removed libs/sr/assets/src/gen/chars/Argenti/skill.png
Diff not rendered.
Binary file added libs/sr/assets/src/gen/chars/Argenti/skill_0.png
Binary file removed libs/sr/assets/src/gen/chars/Argenti/talent.png
Diff not rendered.
Binary file added libs/sr/assets/src/gen/chars/Argenti/talent_0.png
Binary file removed libs/sr/assets/src/gen/chars/Argenti/technique.png
Diff not rendered.
Binary file removed libs/sr/assets/src/gen/chars/Argenti/ult.png
Diff not rendered.
Binary file added libs/sr/assets/src/gen/chars/Argenti/ult_0.png
Binary file added libs/sr/assets/src/gen/chars/Argenti/ult_1.png
Binary file removed libs/sr/assets/src/gen/chars/Arlan/basic.png
Diff not rendered.
Binary file added libs/sr/assets/src/gen/chars/Arlan/basic_0.png
Binary file modified libs/sr/assets/src/gen/chars/Arlan/bonusAbility1.png
Binary file modified libs/sr/assets/src/gen/chars/Arlan/bonusAbility2.png
Binary file modified libs/sr/assets/src/gen/chars/Arlan/bonusAbility3.png
Binary file modified libs/sr/assets/src/gen/chars/Arlan/eidolon1.png
Binary file modified libs/sr/assets/src/gen/chars/Arlan/eidolon2.png
Binary file modified libs/sr/assets/src/gen/chars/Arlan/eidolon3.png
Binary file modified libs/sr/assets/src/gen/chars/Arlan/eidolon4.png
Binary file modified libs/sr/assets/src/gen/chars/Arlan/eidolon5.png
Binary file modified libs/sr/assets/src/gen/chars/Arlan/eidolon6.png
Loading

0 comments on commit 57ab203

Please sign in to comment.