Skip to content

Commit b71a8b2

Browse files
committed
feat: sort professions by in-game order and use correct EN names
1 parent 0e5897c commit b71a8b2

File tree

2 files changed

+154
-124
lines changed

2 files changed

+154
-124
lines changed

scripts/shared.ts

Lines changed: 73 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,47 @@ const CHARACTER_BLOCKLIST = [
6262
'token_10012_rosmon_shield', // 迷迭香的战术装备:It's just not gonna be there.
6363
]
6464

65-
const PROFESSION_NAMES = {
66-
MEDIC: '医疗',
67-
WARRIOR: '近卫',
68-
SPECIAL: '特种',
69-
SNIPER: '狙击',
70-
PIONEER: '先锋',
71-
TANK: '重装',
72-
CASTER: '术师',
73-
SUPPORT: '辅助',
65+
const PROFESSIONS = {
66+
PIONEER: {
67+
name: '先锋',
68+
name_en: 'Vanguard',
69+
code: 512,
70+
},
71+
WARRIOR: {
72+
name: '近卫',
73+
name_en: 'Guard',
74+
code: 1,
75+
},
76+
TANK: {
77+
name: '重装',
78+
name_en: 'Defender',
79+
code: 4,
80+
},
81+
SNIPER: {
82+
name: '狙击',
83+
name_en: 'Sniper',
84+
code: 2,
85+
},
86+
CASTER: {
87+
name: '术师',
88+
name_en: 'Caster',
89+
code: 32,
90+
},
91+
MEDIC: {
92+
name: '医疗',
93+
name_en: 'Medic',
94+
code: 8,
95+
},
96+
SUPPORT: {
97+
name: '辅助',
98+
name_en: 'Supporter',
99+
code: 16,
100+
},
101+
SPECIAL: {
102+
name: '特种',
103+
name_en: 'Specialist',
104+
code: 64,
105+
},
74106
}
75107

76108
async function json(url: string) {
@@ -86,7 +118,11 @@ export async function getOperators() {
86118
json(UNIEQUIP_TABLE_JSON_URL_EN),
87119
])
88120

89-
const { subProfDict: subProfDictCN, equipDict } = uniequipTableCN
121+
const {
122+
subProfDict: subProfDictCN,
123+
subProfToProfDict,
124+
equipDict,
125+
} = uniequipTableCN
90126
const { subProfDict: subProfDictEN } = uniequipTableEN
91127
const equipsByOperatorId = Object.values(equipDict).reduce(
92128
(acc: Record<string, any[]>, equip: any) => {
@@ -97,47 +133,41 @@ export async function getOperators() {
97133
{},
98134
)
99135

136+
const professions: Professions = Object.entries(PROFESSIONS).map(
137+
([id, { name, name_en, code }]) => {
138+
const subProfessions = (
139+
Object.values(subProfDictCN) as {
140+
subProfessionId: string
141+
subProfessionName: string
142+
subProfessionCatagory: number
143+
}[]
144+
)
145+
.filter((x) => subProfToProfDict[x.subProfessionId] === code)
146+
.sort((a, b) => a.subProfessionCatagory - b.subProfessionCatagory)
147+
.map(({ subProfessionId, subProfessionName }) => ({
148+
id: subProfessionId,
149+
name: subProfessionName,
150+
name_en:
151+
subProfDictEN[subProfessionId]?.subProfessionName ||
152+
capitalize(subProfessionId),
153+
}))
154+
return {
155+
id,
156+
name,
157+
name_en,
158+
sub: subProfessions,
159+
}
160+
},
161+
)
162+
100163
const opIds = Object.keys(charTableCN)
101-
const professions: Professions = []
102164
const result = uniqBy(
103165
opIds.flatMap((id) => {
104166
const op = charTableCN[id]
105167
const enName = charTableEN[id]?.name || op.appellation || op.name
106168

107169
if (['TRAP'].includes(op.profession)) return []
108170

109-
if (!['TOKEN'].includes(op.profession)) {
110-
const prof = professions.find((p) => p.id === op.profession)
111-
if (!prof) {
112-
const enSubProfName =
113-
subProfDictEN?.[op.subProfessionId]?.subProfessionName ||
114-
capitalize(op.subProfessionId)
115-
116-
professions.push({
117-
id: op.profession,
118-
name: PROFESSION_NAMES[op.profession],
119-
name_en:
120-
op.profession.charAt(0) + op.profession.slice(1).toLowerCase(),
121-
sub: [
122-
{
123-
id: op.subProfessionId,
124-
name: subProfDictCN[op.subProfessionId].subProfessionName,
125-
name_en: enSubProfName,
126-
},
127-
],
128-
})
129-
} else if (!prof.sub.find((p) => p.id === op.subProfessionId)) {
130-
const enSubProfName =
131-
subProfDictEN?.[op.subProfessionId]?.subProfessionName ||
132-
capitalize(op.subProfessionId)
133-
134-
prof.sub.push({
135-
id: op.subProfessionId,
136-
name: subProfDictCN[op.subProfessionId].subProfessionName,
137-
name_en: enSubProfName,
138-
})
139-
}
140-
}
141171
const modules = equipsByOperatorId[id]
142172
?.sort((a, b) => a.charEquipOrder - b.charEquipOrder)
143173
.map(({ typeName1, typeName2 }) => {

src/models/generated/operators.json

Lines changed: 81 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -4831,97 +4831,41 @@
48314831
],
48324832
"PROFESSIONS": [
48334833
{
4834-
"id": "MEDIC",
4835-
"name": "医疗",
4836-
"name_en": "Medic",
4834+
"id": "PIONEER",
4835+
"name": "先锋",
4836+
"name_en": "Vanguard",
48374837
"sub": [
4838-
{ "id": "physician", "name": "医师", "name_en": "Medic" },
4839-
{
4840-
"id": "ringhealer",
4841-
"name": "群愈师",
4842-
"name_en": "Multi-target Medic"
4843-
},
4844-
{ "id": "healer", "name": "疗养师", "name_en": "Therapist" },
4845-
{ "id": "wandermedic", "name": "行医", "name_en": "Wandering Medic" },
4846-
{
4847-
"id": "incantationmedic",
4848-
"name": "咒愈师",
4849-
"name_en": "Incantation Medic"
4850-
},
4851-
{ "id": "chainhealer", "name": "链愈师", "name_en": "Chain Medic" }
4838+
{ "id": "pioneer", "name": "尖兵", "name_en": "Pioneer" },
4839+
{ "id": "charger", "name": "冲锋手", "name_en": "Charger" },
4840+
{ "id": "tactician", "name": "战术家", "name_en": "Tactician" },
4841+
{ "id": "bearer", "name": "执旗手", "name_en": "Standard Bearer" },
4842+
{ "id": "agent", "name": "情报官", "name_en": "Agent" }
48524843
]
48534844
},
48544845
{
48554846
"id": "WARRIOR",
48564847
"name": "近卫",
4857-
"name_en": "Warrior",
4848+
"name_en": "Guard",
48584849
"sub": [
4859-
{ "id": "fearless", "name": "无畏者", "name_en": "Dreadnought" },
48604850
{ "id": "centurion", "name": "强攻手", "name_en": "Centurion" },
4851+
{ "id": "fighter", "name": "斗士", "name_en": "Fighter" },
4852+
{ "id": "artsfghter", "name": "术战者", "name_en": "Arts Fighter" },
48614853
{ "id": "instructor", "name": "教官", "name_en": "Instructor" },
48624854
{ "id": "lord", "name": "领主", "name_en": "Lord" },
4863-
{ "id": "artsfghter", "name": "术战者", "name_en": "Arts Fighter" },
48644855
{ "id": "sword", "name": "剑豪", "name_en": "Swordmaster" },
48654856
{ "id": "musha", "name": "武者", "name_en": "Soloblade" },
4866-
{ "id": "crusher", "name": "重剑手", "name_en": "Crusher" },
4857+
{ "id": "fearless", "name": "无畏者", "name_en": "Dreadnought" },
48674858
{ "id": "reaper", "name": "收割者", "name_en": "Reaper" },
48684859
{ "id": "librator", "name": "解放者", "name_en": "Liberator" },
4869-
{ "id": "fighter", "name": "斗士", "name_en": "Fighter" },
4860+
{ "id": "crusher", "name": "重剑手", "name_en": "Crusher" },
48704861
{ "id": "hammer", "name": "撼地者", "name_en": "Earthshaker" },
48714862
{ "id": "primguard", "name": "本源近卫", "name_en": "Primguard" }
48724863
]
48734864
},
4874-
{
4875-
"id": "SPECIAL",
4876-
"name": "特种",
4877-
"name_en": "Special",
4878-
"sub": [
4879-
{ "id": "executor", "name": "处决者", "name_en": "Executor" },
4880-
{ "id": "merchant", "name": "行商", "name_en": "Merchant" },
4881-
{ "id": "hookmaster", "name": "钩索师", "name_en": "Hookmaster" },
4882-
{ "id": "stalker", "name": "伏击客", "name_en": "Ambusher" },
4883-
{ "id": "pusher", "name": "推击手", "name_en": "Push Stroker" },
4884-
{ "id": "dollkeeper", "name": "傀儡师", "name_en": "Dollkeeper" },
4885-
{ "id": "skywalker", "name": "巡空者", "name_en": "Skyranger" },
4886-
{ "id": "geek", "name": "怪杰", "name_en": "Geek" },
4887-
{ "id": "traper", "name": "陷阱师", "name_en": "Trapmaster" },
4888-
{ "id": "alchemist", "name": "炼金师", "name_en": "Alchemist" }
4889-
]
4890-
},
4891-
{
4892-
"id": "SNIPER",
4893-
"name": "狙击",
4894-
"name_en": "Sniper",
4895-
"sub": [
4896-
{ "id": "fastshot", "name": "速射手", "name_en": "Marksman" },
4897-
{ "id": "bombarder", "name": "投掷手", "name_en": "Flinger" },
4898-
{ "id": "aoesniper", "name": "炮手", "name_en": "Artilleryman" },
4899-
{ "id": "reaperrange", "name": "散射手", "name_en": "Spreadshooter" },
4900-
{ "id": "longrange", "name": "神射手", "name_en": "Deadeye" },
4901-
{ "id": "closerange", "name": "重射手", "name_en": "Heavyshooter" },
4902-
{ "id": "siegesniper", "name": "攻城手", "name_en": "Besieger" },
4903-
{ "id": "loopshooter", "name": "回环射手", "name_en": "Loopshooter" },
4904-
{ "id": "hunter", "name": "猎手", "name_en": "Hunter" }
4905-
]
4906-
},
4907-
{
4908-
"id": "SUPPORT",
4909-
"name": "辅助",
4910-
"name_en": "Support",
4911-
"sub": [
4912-
{ "id": "bard", "name": "吟游者", "name_en": "Bard" },
4913-
{ "id": "ritualist", "name": "巫役", "name_en": "Ritualist" },
4914-
{ "id": "slower", "name": "凝滞师", "name_en": "Decel Binder" },
4915-
{ "id": "summoner", "name": "召唤师", "name_en": "Summoner" },
4916-
{ "id": "craftsman", "name": "工匠", "name_en": "Artificer" },
4917-
{ "id": "underminer", "name": "削弱者", "name_en": "Hexer" },
4918-
{ "id": "blessing", "name": "护佑者", "name_en": "Abjurer" }
4919-
]
4920-
},
49214865
{
49224866
"id": "TANK",
49234867
"name": "重装",
4924-
"name_en": "Tank",
4868+
"name_en": "Defender",
49254869
"sub": [
49264870
{ "id": "protector", "name": "铁卫", "name_en": "Protector" },
49274871
{ "id": "guardian", "name": "守护者", "name_en": "Guardian" },
@@ -4931,13 +4875,13 @@
49314875
"name": "驭法铁卫",
49324876
"name_en": "Arts Protector"
49334877
},
4878+
{ "id": "duelist", "name": "决战者", "name_en": "Duelist" },
4879+
{ "id": "fortress", "name": "要塞", "name_en": "Fortress" },
49344880
{
49354881
"id": "shotprotector",
49364882
"name": "哨戒铁卫",
49374883
"name_en": "Sentry Protector"
49384884
},
4939-
{ "id": "fortress", "name": "要塞", "name_en": "Fortress" },
4940-
{ "id": "duelist", "name": "决战者", "name_en": "Duelist" },
49414885
{
49424886
"id": "primprotector",
49434887
"name": "本源铁卫",
@@ -4946,15 +4890,19 @@
49464890
]
49474891
},
49484892
{
4949-
"id": "PIONEER",
4950-
"name": "先锋",
4951-
"name_en": "Pioneer",
4893+
"id": "SNIPER",
4894+
"name": "狙击",
4895+
"name_en": "Sniper",
49524896
"sub": [
4953-
{ "id": "pioneer", "name": "尖兵", "name_en": "Pioneer" },
4954-
{ "id": "charger", "name": "冲锋手", "name_en": "Charger" },
4955-
{ "id": "bearer", "name": "执旗手", "name_en": "Standard Bearer" },
4956-
{ "id": "tactician", "name": "战术家", "name_en": "Tactician" },
4957-
{ "id": "agent", "name": "情报官", "name_en": "Agent" }
4897+
{ "id": "fastshot", "name": "速射手", "name_en": "Marksman" },
4898+
{ "id": "closerange", "name": "重射手", "name_en": "Heavyshooter" },
4899+
{ "id": "aoesniper", "name": "炮手", "name_en": "Artilleryman" },
4900+
{ "id": "longrange", "name": "神射手", "name_en": "Deadeye" },
4901+
{ "id": "reaperrange", "name": "散射手", "name_en": "Spreadshooter" },
4902+
{ "id": "siegesniper", "name": "攻城手", "name_en": "Besieger" },
4903+
{ "id": "bombarder", "name": "投掷手", "name_en": "Flinger" },
4904+
{ "id": "hunter", "name": "猎手", "name_en": "Hunter" },
4905+
{ "id": "loopshooter", "name": "回环射手", "name_en": "Loopshooter" }
49584906
]
49594907
},
49604908
{
@@ -4969,13 +4917,65 @@
49694917
"name_en": "Splash Caster"
49704918
},
49714919
{ "id": "funnel", "name": "驭械术师", "name_en": "Mech-accord Caster" },
4920+
{ "id": "phalanx", "name": "阵法术师", "name_en": "Phalanx Caster" },
49724921
{ "id": "mystic", "name": "秘术师", "name_en": "Mystic Caster" },
49734922
{ "id": "chain", "name": "链术师", "name_en": "Chain Caster" },
4974-
{ "id": "phalanx", "name": "阵法术师", "name_en": "Phalanx Caster" },
49754923
{ "id": "blastcaster", "name": "轰击术师", "name_en": "Blast Caster" },
49764924
{ "id": "primcaster", "name": "本源术师", "name_en": "Primal Caster" },
49774925
{ "id": "soulcaster", "name": "塑灵术师", "name_en": "Soulcaster" }
49784926
]
4927+
},
4928+
{
4929+
"id": "MEDIC",
4930+
"name": "医疗",
4931+
"name_en": "Medic",
4932+
"sub": [
4933+
{ "id": "physician", "name": "医师", "name_en": "Medic" },
4934+
{
4935+
"id": "ringhealer",
4936+
"name": "群愈师",
4937+
"name_en": "Multi-target Medic"
4938+
},
4939+
{ "id": "healer", "name": "疗养师", "name_en": "Therapist" },
4940+
{ "id": "wandermedic", "name": "行医", "name_en": "Wandering Medic" },
4941+
{
4942+
"id": "incantationmedic",
4943+
"name": "咒愈师",
4944+
"name_en": "Incantation Medic"
4945+
},
4946+
{ "id": "chainhealer", "name": "链愈师", "name_en": "Chain Medic" }
4947+
]
4948+
},
4949+
{
4950+
"id": "SUPPORT",
4951+
"name": "辅助",
4952+
"name_en": "Supporter",
4953+
"sub": [
4954+
{ "id": "slower", "name": "凝滞师", "name_en": "Decel Binder" },
4955+
{ "id": "underminer", "name": "削弱者", "name_en": "Hexer" },
4956+
{ "id": "bard", "name": "吟游者", "name_en": "Bard" },
4957+
{ "id": "blessing", "name": "护佑者", "name_en": "Abjurer" },
4958+
{ "id": "summoner", "name": "召唤师", "name_en": "Summoner" },
4959+
{ "id": "craftsman", "name": "工匠", "name_en": "Artificer" },
4960+
{ "id": "ritualist", "name": "巫役", "name_en": "Ritualist" }
4961+
]
4962+
},
4963+
{
4964+
"id": "SPECIAL",
4965+
"name": "特种",
4966+
"name_en": "Specialist",
4967+
"sub": [
4968+
{ "id": "executor", "name": "处决者", "name_en": "Executor" },
4969+
{ "id": "pusher", "name": "推击手", "name_en": "Push Stroker" },
4970+
{ "id": "stalker", "name": "伏击客", "name_en": "Ambusher" },
4971+
{ "id": "hookmaster", "name": "钩索师", "name_en": "Hookmaster" },
4972+
{ "id": "geek", "name": "怪杰", "name_en": "Geek" },
4973+
{ "id": "merchant", "name": "行商", "name_en": "Merchant" },
4974+
{ "id": "traper", "name": "陷阱师", "name_en": "Trapmaster" },
4975+
{ "id": "dollkeeper", "name": "傀儡师", "name_en": "Dollkeeper" },
4976+
{ "id": "alchemist", "name": "炼金师", "name_en": "Alchemist" },
4977+
{ "id": "skywalker", "name": "巡空者", "name_en": "Skyranger" }
4978+
]
49794979
}
49804980
]
49814981
}

0 commit comments

Comments
 (0)