Import weapon data

This commit is contained in:
Sakura Knoll
2023-07-09 21:29:45 +09:00 Unverified
parent 5ddceb5d9d
commit a1c4d16264
11 changed files with 453 additions and 103 deletions
+50
View File
@@ -142,3 +142,53 @@ export interface BattlesuitSubSkill {
unlockStar: StarRank unlockStar: StarRank
toggle: boolean toggle: boolean
} }
export interface WeaponCatalogItem {
id: string
name: string
type: WeaponType
maxRarity: 1 | 2 | 3 | 4 | 5
}
export interface WeaponData {
id: string
weapons: {
id: string
rarity: number
maxLv: number
type: WeaponType
title: string
description: string
icon: string
hpBase: number
hpAdd: number
spBase: number
spAdd: number
attackBase: number
attackAdd: number
defenceBase: number
defenceAdd: number
criticalBase: number
criticalAdd: number
resistanceBase: number
resistanceAdd: number
skills: WeaponSkill[]
rankUpMaterials: {
id: string
amount: number
}[]
}
}
export interface WeaponSkill {
id: string
name: string
info: string
icon?: string
skillCd: number
skillSpCost: number
skillSpNeed: number
tags: {
type: TagType
comment: string
}[]
}
@@ -3,6 +3,7 @@ import { compileBattlesuitData } from './compileBattlesuitData'
describe('compileBattlesuitData', () => { describe('compileBattlesuitData', () => {
it('converts tags', () => { it('converts tags', () => {
const list = compileBattlesuitData() const list = compileBattlesuitData()
expect(list[0]).toMatchObject({ expect(list[0]).toMatchObject({
id: expect.any(String), id: expect.any(String),
tags: ['physical-dmg', 'stun', 'burst', 'time-mastery'] tags: ['physical-dmg', 'stun', 'burst', 'time-mastery']
@@ -6,19 +6,13 @@ import {
CharacterType, CharacterType,
SkillTagItem, SkillTagItem,
SkillType, SkillType,
TagType, TagType
WeaponType
} from '../../data/types' } from '../../data/types'
import { getRawAvatarDataMap } from '../raw/avatarData' import { getRawAvatarDataMap } from '../raw/avatarData'
import { getRawAvatarSkillDataMap } from '../raw/avatarSkillData' import { getRawAvatarSkillDataMap } from '../raw/avatarSkillData'
import { getRawAvatarSubSkillDataMap } from '../raw/avatarSubSkillData' import { getRawAvatarSubSkillDataMap } from '../raw/avatarSubSkillData'
import { getRawAvatarTagUnLockDataMap } from '../raw/avatarTagUnLockData' import { getRawAvatarTagUnLockDataMap } from '../raw/avatarTagUnLockData'
import { getRawTextMap } from '../raw/textMap' import { convertWeaponType as convertWeaponType, convertTagType, getText } from './utils'
export function getText(id: string | number) {
const rawTextMap = getRawTextMap()
return rawTextMap[id]?.Text || null
}
export function compileBattlesuitData(): Battlesuit[] { export function compileBattlesuitData(): Battlesuit[] {
const rawAvatarDataMap = getRawAvatarDataMap() const rawAvatarDataMap = getRawAvatarDataMap()
@@ -42,13 +36,13 @@ export function compileBattlesuitData(): Battlesuit[] {
enLastName: getText(rawAvatarData.EnLastName), enLastName: getText(rawAvatarData.EnLastName),
attributeType: convertAttributeToAttributeType(rawAvatarData.Attribute), attributeType: convertAttributeToAttributeType(rawAvatarData.Attribute),
isEasterner: rawAvatarData.IsEasterner, isEasterner: rawAvatarData.IsEasterner,
weapon: convertClassIdToWeaponType(rawAvatarData.ClassID), weapon: convertWeaponType(rawAvatarData.ClassID),
character: convertRoleIdToCharacterType(rawAvatarData.RoleID), character: convertRoleIdToCharacterType(rawAvatarData.RoleID),
initialStar: convertStar(rawAvatarData.UnlockStar, 0), initialStar: convertStar(rawAvatarData.UnlockStar, 0),
tags: rawAvatarData.TagUnlockList.map(rawTagId => { tags: rawAvatarData.TagUnlockList.map(rawTagId => {
const rawAvatarTagUnLock = rawAvatarTagUnLockDataMap[rawTagId] const rawAvatarTagUnLock = rawAvatarTagUnLockDataMap[rawTagId]
return convertRawTagIdToTagType(rawAvatarTagUnLock.TagID) return convertTagType(rawAvatarTagUnLock.TagID)
}), }),
skills: rawAvatarData.SkillList.map<BattlesuitSkill>(rawSkillId => { skills: rawAvatarData.SkillList.map<BattlesuitSkill>(rawSkillId => {
const rawSkillData = rawSkillDataMap[rawSkillId] const rawSkillData = rawSkillDataMap[rawSkillId]
@@ -154,35 +148,6 @@ function convertAttributeToAttributeType(rawValue: number): AttributeType {
} }
} }
function convertClassIdToWeaponType(rawValue: number): WeaponType {
switch (rawValue) {
case 1:
return 'pistols'
case 2:
return 'katana'
case 3:
return 'cannon'
case 4:
return '2-handed'
case 5:
return 'cross'
case 6:
return 'fists'
case 7:
return 'scythe'
case 8:
return 'lance'
case 9:
return 'bow'
case 10:
return 'chakram'
case 11:
return 'javelin'
default:
throw new Error(`Unsupported raw classId(weapon type) (${rawValue})`)
}
}
function convertRoleIdToCharacterType(rawValue: number): CharacterType { function convertRoleIdToCharacterType(rawValue: number): CharacterType {
switch (rawValue) { switch (rawValue) {
case 1: case 1:
@@ -281,63 +246,6 @@ function convertShowOrderToSkillType(rawShowOrder: number): SkillType {
} }
} }
function convertRawTagIdToTagType(rawTagId: number): TagType {
switch (rawTagId) {
case 1001:
return 'branch'
case 1002:
return 'charge'
case 1003:
return 'physical-dmg'
case 1004:
return 'fire-dmg'
case 1005:
return 'ice-dmg'
case 1006:
return 'lightning-dmg'
case 1007:
return 'freeze'
case 1008:
return 'paralyze'
case 1009:
return 'stun'
case 1010:
return 'ignite'
case 1011:
return 'bleed'
case 1012:
return 'heavy-atk'
case 1013:
return 'weaken'
case 1014:
return 'impair'
case 1015:
return 'float'
case 1016:
return 'slow-down'
case 1017:
return 'time-mastery'
case 1018:
return 'gather'
case 1019:
return 'heal'
case 1020:
return 'fast-atk'
case 1021:
return 'burst'
case 1022:
return 'shield'
case 1023:
return 'aerial'
case 1024:
return 'ranged'
case 1025:
return 'meele'
}
throw new Error(`Unsupported raw show order(Skill) (${rawTagId})`)
}
function convertRawSkillTag(rawSkillTag: { Strength: number; TagID: number; TagComment: number }): SkillTagItem { function convertRawSkillTag(rawSkillTag: { Strength: number; TagID: number; TagComment: number }): SkillTagItem {
const comment = getText(rawSkillTag.TagComment) const comment = getText(rawSkillTag.TagComment)
return { return {
@@ -0,0 +1,30 @@
import { compileWeaponData } from './compileWeaponData'
describe('compileWeaponData', () => {
it('compiles', () => {
const list = compileWeaponData()
const targetItem = list.find(weapon => weapon.id === '10277')
expect(targetItem).toMatchObject({
id: expect.any(String),
weapons: expect.arrayContaining([
expect.objectContaining({
id: expect.any(String)
})
])
})
expect(targetItem!.weapons[3]).toMatchObject({
skills: [
{
id: '1221'
},
{
id: '2297'
}
]
})
// console.log(targetItem!.weapons[3])
})
})
@@ -0,0 +1,102 @@
import { getRawEquipmentSkillDataMap, RawEquipmentSkillData } from '../raw/equipmentSkillData'
import { getRawWeaponDataMap } from '../raw/weaponData'
import { convertTagType, convertWeaponType, getText } from './utils'
export function compileWeaponData() {
const rawWeaponDataMap = getRawWeaponDataMap()
const rawEquipmentSkillDataMap = getRawEquipmentSkillDataMap()
const rawWeaponMainIdWeaponDataMap = Object.entries(rawWeaponDataMap).reduce((map, [id, rawData]) => {
const rawWeaponMainId = rawData.WeaponMainID.toString()
let weaponList = map.get(rawWeaponMainId)
if (weaponList == null) {
weaponList = []
map.set(rawWeaponMainId, weaponList)
}
const skills = []
if (rawData.Prop1ID !== 0) {
const skillId = rawData.Prop1ID.toString()
const rawSkill = rawEquipmentSkillDataMap[skillId]
skills.push({
id: skillId,
...convertWeaponSkill(rawSkill)
})
}
if (rawData.Prop2ID !== 0) {
const skillId = rawData.Prop2ID.toString()
const rawSkill = rawEquipmentSkillDataMap[skillId]
skills.push({
id: skillId,
...convertWeaponSkill(rawSkill)
})
}
if (rawData.Prop3ID !== 0) {
const skillId = rawData.Prop3ID.toString()
const rawSkill = rawEquipmentSkillDataMap[skillId]
skills.push({
id: skillId,
...convertWeaponSkill(rawSkill)
})
}
const icon = rawData.IconPath.split('/').pop()
weaponList.push({
id,
rarity: rawData.Rarity,
maxLv: rawData.MaxLv,
type: convertWeaponType(rawData.BaseType),
title: getText(rawData.DisplayTitle),
description: getText(rawData.DisplayDescription),
icon,
hpBase: rawData.HPBase,
hpAdd: rawData.HPAdd,
spBase: rawData.SPBase,
spAdd: rawData.SPAdd,
attackBase: rawData.AttackBase,
attackAdd: rawData.AttackAdd,
defenceBase: rawData.DefenceBase,
defenceAdd: rawData.DefenceAdd,
criticalBase: rawData.CriticalBase,
criticalAdd: rawData.CriticalAdd,
resistanceBase: rawData.ResistanceBase,
resistanceAdd: rawData.ResistanceAdd,
skills,
rankUpMaterials: rawData.EvoMaterial.map(rawMaterial => {
return {
id: rawMaterial.ID.toString(),
amount: rawMaterial.Num
}
}),
powerType: rawData.PowerType
})
return map
}, new Map())
const weaponIdList = [...rawWeaponMainIdWeaponDataMap.keys()]
return weaponIdList.map(weaponId => {
return {
id: weaponId,
weapons: rawWeaponMainIdWeaponDataMap.get(weaponId)
}
})
function convertWeaponSkill(rawSkill: RawEquipmentSkillData) {
const iconName = rawSkill.SkillIconPath.split('/').pop()
return {
name: getText(rawSkill.SkillName),
info: getText(rawSkill.SkillDisplay),
icon: iconName != null && iconName.length > 0 ? iconName : undefined,
skillCd: rawSkill.SkillCD,
skillSpCost: rawSkill.SPCost,
skillSpNeed: rawSkill.SPNeed,
tags: rawSkill.TagList.map(rawEquipmentSkillTag => {
return {
type: convertTagType(rawEquipmentSkillTag.TagID),
comment: getText(rawEquipmentSkillTag.TagComment)
}
})
}
}
}
@@ -0,0 +1,93 @@
import { TagType, WeaponType } from '../../data/types'
import { getRawTextMap } from '../raw/textMap'
export function getText(id: string | number) {
const rawTextMap = getRawTextMap()
return rawTextMap[id]?.Text || null
}
export function convertWeaponType(rawValue: number): WeaponType {
switch (rawValue) {
case 1:
return 'pistols'
case 2:
return 'katana'
case 3:
return 'cannon'
case 4:
return '2-handed'
case 5:
return 'cross'
case 6:
return 'fists'
case 7:
return 'scythe'
case 8:
return 'lance'
case 9:
return 'bow'
case 10:
return 'chakram'
case 11:
return 'javelin'
default:
throw new Error(`Unsupported raw classId(weapon type) (${rawValue})`)
}
}
export function convertTagType(rawTagId: number): TagType {
switch (rawTagId) {
case 1001:
return 'branch'
case 1002:
return 'charge'
case 1003:
return 'physical-dmg'
case 1004:
return 'fire-dmg'
case 1005:
return 'ice-dmg'
case 1006:
return 'lightning-dmg'
case 1007:
return 'freeze'
case 1008:
return 'paralyze'
case 1009:
return 'stun'
case 1010:
return 'ignite'
case 1011:
return 'bleed'
case 1012:
return 'heavy-atk'
case 1013:
return 'weaken'
case 1014:
return 'impair'
case 1015:
return 'float'
case 1016:
return 'slow-down'
case 1017:
return 'time-mastery'
case 1018:
return 'gather'
case 1019:
return 'heal'
case 1020:
return 'fast-atk'
case 1021:
return 'burst'
case 1022:
return 'shield'
case 1023:
return 'aerial'
case 1024:
return 'ranged'
case 1025:
return 'meele'
}
throw new Error(`Unsupported raw show order(Skill) (${rawTagId})`)
}
+14 -2
View File
@@ -1,13 +1,16 @@
import fs from 'fs' import fs from 'fs'
import path from 'path' import path from 'path'
import YAML from 'yaml' import YAML from 'yaml'
import { BattlesuitCatalogItem } from '../data/types' import { BattlesuitCatalogItem, WeaponCatalogItem } from '../data/types'
export const dataDir = path.join(process.cwd(), 'data/v2-pre') export const dataDir = path.join(process.cwd(), 'data/v2-pre')
export const battlesuitsDir = path.join(dataDir, 'battlesuits')
export const battlesuitsDir = path.join(dataDir, 'battlesuits')
export const battlesuitCatalogPath = path.join(dataDir, 'battlesuit-catalog.yaml') export const battlesuitCatalogPath = path.join(dataDir, 'battlesuit-catalog.yaml')
export const weaponsDir = path.join(dataDir, 'weapons')
export const weaopnCatalogPath = path.join(dataDir, 'weapon-catalog.yaml')
export function loadBattlesuitCatalog(): BattlesuitCatalogItem[] { export function loadBattlesuitCatalog(): BattlesuitCatalogItem[] {
return readYamlFile(battlesuitCatalogPath) return readYamlFile(battlesuitCatalogPath)
} }
@@ -17,6 +20,15 @@ export function loadBattlesuitData(id: string) {
return readYamlFile(battlesuitDataPath) return readYamlFile(battlesuitDataPath)
} }
export function loadWeaponCatalog(): WeaponCatalogItem[] {
return readYamlFile(weaopnCatalogPath)
}
export function loadWeaponData(id: string) {
const weaponDataPath = path.join(weaponsDir, `${id}.yaml`)
return readYamlFile(weaponDataPath)
}
function readYamlFile(pathname: string) { function readYamlFile(pathname: string) {
return YAML.parse(fs.readFileSync(pathname).toString()) return YAML.parse(fs.readFileSync(pathname).toString())
} }
@@ -0,0 +1,23 @@
import { loadRawData } from './loadRawData'
export function getRawEquipmentSkillDataMap(): RawEquipmentSkillDataMap {
return loadRawData('EquipmentSkillData.json')
}
export type RawEquipmentSkillDataMap = {
[key: string]: RawEquipmentSkillData
}
export interface RawEquipmentSkillData {
SkillName: number
SkillDisplay: number
SkillIconPath: string
SkillCD: number
SPCost: number
SPNeed: number
MaxChargesCount: number
TagList: {
TagID: number
TagComment: number
}[]
}
+87
View File
@@ -0,0 +1,87 @@
import { loadRawData } from './loadRawData'
export function getRawWeaponDataMap(): RawWeaponDataMap {
return loadRawData('WeaponData.json')
}
export type RawWeaponDataMap = {
[key: string]: RawWeaponData
}
export interface RawWeaponData {
Rarity: number
MaxRarity: number
SubRarity: number
SubMaxRarity: number
Cost: number
PowerType: number
MaxLv: number
ExpType: number
SellPriceBase: number
SellPriceAdd: number
GearExpProvideBase: number
GearExpPorvideAdd: number
BaseType: number
BodyMod: string
DisplayTitle: number
DisplayDescription: number
IconPath: string
ImagePath: '0'
HPBase: number
HPAdd: number
SPBase: number
SPAdd: number
AttackBase: number
AttackAdd: number
DefenceBase: number
DefenceAdd: number
CriticalBase: number
CriticalAdd: number
ResistanceBase: number
ResistanceAdd: number
EvoMaterial: {
ID: number
Num: number
}[]
EvoPlayerLevel: number
EvoID: number
Prop1ID: number
Prop1Param1: number
Prop1Param2: number
Prop1Param3: number
Prop1Param1Add: number
Prop1Param2Add: number
Prop1Param3Add: number
Prop2ID: number
Prop2Param1: number
Prop2Param2: number
Prop2Param3: number
Prop2Param1Add: number
Prop2Param2Add: number
Prop2Param3Add: number
Prop3ID: number
Prop3Param1: number
Prop3Param2: number
Prop3Param3: number
Prop3Param1Add: number
Prop3Param2Add: number
Prop3Param3Add: number
Protect: boolean
ExDisjoinCurrencyCost: number
ExDisjoinAddMaterial: []
DisjoinScoinCost: number
DisjoinAddMaterial: []
WeaponMainID: number
LinkIDList: []
WeaponQuality: number
SellPriceID: number
Transcendent: false
Target: number
GachaMainDropDisplayConfig: number[]
GachaGiftDropDisplayConfig: []
PreloadEffectFolderPath: string
WeaponFilterList: number[]
SoundBanks: []
CollaborationWeaponID: number
AvatarCustomDisplayID: number
}
@@ -0,0 +1,13 @@
import { loadRawData } from './loadRawData'
export function getRawWeaponMainIdDataMap(): RawWeaponMainIdDataMap {
return loadRawData('WeaponMainIDData.json')
}
export type RawWeaponMainIdDataMap = {
[key: string]: RawWeaponMainIdData
}
export interface RawWeaponMainIdData {
ReforgeTargetIDList: number[]
}
+36 -5
View File
@@ -3,19 +3,27 @@ import { createDirIfNotExist } from '../lib/v2-pre/server/fsUtils'
import fs from 'fs' import fs from 'fs'
import YAML from 'yaml' import YAML from 'yaml'
import { runScript } from './lib/utils' import { runScript } from './lib/utils'
import { battlesuitCatalogPath, battlesuitsDir, dataDir } from '../lib/v2-pre/server/loadData' import {
import { BattlesuitCatalogItem } from '../lib/v2-pre/data/types' battlesuitCatalogPath,
import { compileBattlesuitData } from '../lib/v2-pre/server/migration/compileBattlesuitData' battlesuitsDir,
dataDir,
weaopnCatalogPath,
weaponsDir
} from '../lib/v2-pre/server/loadData'
import { BattlesuitCatalogItem, WeaponCatalogItem } from '../lib/v2-pre/data/types'
import { compileBattlesuitData } from '../lib/v2-pre/server/compileData/compileBattlesuitData'
import { compileWeaponData } from '../lib/v2-pre/server/compileData/compileWeaponData'
runScript(async () => { runScript(async () => {
createDirIfNotExist(dataDir) createDirIfNotExist(dataDir)
writeBattlesuitData() writeBattlesuitData()
writeWeaponData()
}) })
function writeBattlesuitData() { function writeBattlesuitData() {
const battlesuitList = compileBattlesuitData() const battlesuitList = compileBattlesuitData()
const simplifiedList: BattlesuitCatalogItem[] = battlesuitList.map(battlesuit => { const catalogList: BattlesuitCatalogItem[] = battlesuitList.map(battlesuit => {
return { return {
id: battlesuit.id, id: battlesuit.id,
fullName: battlesuit.fullName, fullName: battlesuit.fullName,
@@ -26,7 +34,7 @@ function writeBattlesuitData() {
} }
}) })
fs.writeFileSync(battlesuitCatalogPath, YAML.stringify(simplifiedList)) fs.writeFileSync(battlesuitCatalogPath, YAML.stringify(catalogList))
createDirIfNotExist(battlesuitsDir) createDirIfNotExist(battlesuitsDir)
@@ -35,3 +43,26 @@ function writeBattlesuitData() {
fs.writeFileSync(battlesuitDataPath, YAML.stringify(battlesuit)) fs.writeFileSync(battlesuitDataPath, YAML.stringify(battlesuit))
} }
} }
function writeWeaponData() {
const weaponDataList = compileWeaponData()
const catalogList: WeaponCatalogItem[] = weaponDataList.map(weapon => {
const maxedWeapon = weapon.weapons[weapon.weapons.length - 1]
return {
id: weapon.id,
name: maxedWeapon.name,
type: maxedWeapon.type,
maxRarity: maxedWeapon.rarity
}
})
fs.writeFileSync(weaopnCatalogPath, YAML.stringify(catalogList))
createDirIfNotExist(weaponsDir)
for (const weaponData of weaponDataList) {
const weaponDataPath = path.join(weaponsDir, `${weaponData.id}.yaml`)
fs.writeFileSync(weaponDataPath, YAML.stringify(weaponData))
}
}