diff --git a/electron/main.ts b/electron/main.ts index 85fde38..4d823db 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -5,14 +5,16 @@ import { app, BrowserWindow, ipcMain, dialog, shell } from 'electron'; import * as path from 'path'; import * as fs from 'fs'; -import { exec } from 'child_process'; +import { pathToFileURL } from 'url'; +import { exec, spawn } from 'child_process'; import { promisify } from 'util'; import { autoUpdater, UpdateInfo, ProgressInfo } from 'electron-updater'; +import * as yaml from 'js-yaml'; import { initPythonEnv, clearPythonCache, isAllowedPythonVersion, findPython, checkEnvironment, checkForUpdates, installDependencies, installPortablePython, - pullUpdates, + pullUpdates, ensurePip, localSitePackages, pipEnv, } from './pythonEnv'; import { detectEmulator } from './emulatorDetect'; import { initBackend, getBackendProcess, startBackend, stopBackend, runSetupScript } from './backend'; @@ -217,6 +219,626 @@ function copyDirNoOverwrite(src: string, dest: string): void { } } +interface ShipLibraryStatus { + exists: boolean; + path: string; + generatedAt?: string; + shipCount: number; + assetCount: number; + missingAssets: number; + error?: string; +} + +interface ShipLibraryUpdateResult { + success: boolean; + output?: string; + generated_at?: string; + ship_count?: number; + asset_count?: number; + added?: number; + updated?: number; + removed?: number; + downloaded?: number; + failed?: number; + failures?: string[]; + error?: string; +} + +interface ShipLibraryManifest { + schemaVersion: number; + generatedAt: string; + labels: Record; + typeGroups: Record; + ships: Array>; +} + +/** 当前可写的舰船资料库目录。 */ +function shipLibraryDir(): string { + if (isPackaged()) { + return path.join(app.getPath('userData'), 'ship-library'); + } + return path.join(resourceRoot(), 'resource', 'ship-library'); +} + +/** 打包后将内置资料库复制到用户目录,已有文件不覆盖。 */ +function initUserShipLibraryDir(): void { + if (!isPackaged()) return; + const bundledDir = path.join(resourceRoot(), 'resource', 'ship-library'); + if (fs.existsSync(bundledDir)) { + copyDirNoOverwrite(bundledDir, shipLibraryDir()); + } +} + +const ALLOWED_FLEET_SHIP_TYPES = new Set([ + 'dd', + 'cl', + 'ca', + 'cav', + 'clt', + 'bb', + 'bc', + 'bbv', + 'cv', + 'cvl', + 'av', + 'ss', + 'ssg', + 'cg', + 'cgaa', + 'ddg', + 'ddgaa', + 'bm', + 'cbg', + 'cf', + 'ss_or_ssg', +]); +const TEAM_FILE_PATTERN = /^team[-_][^\\/]+\.ya?ml$/i; + +interface UserTeamShipRule { + name: string; + search_name?: string; + ship_type?: string[]; + min_level?: number; + max_level?: number; +} + +interface UserTeamPlanSlot { + name?: string; + search_name?: string; + ship_type?: string[]; + min_level?: number; + max_level?: number; + candidates?: UserTeamShipRule[]; +} + +interface UserTeamPlan { + file?: string; + name: string; + ships: UserTeamPlanSlot[]; +} + +/** 用户编队目录在开发模式下固定为 resource/user_team_plans。 */ +function userTeamPlansDir(): string { + return path.join( + isPackaged() ? appRoot() : resourceRoot(), + 'resource', + 'user_team_plans', + ); +} + +function initUserTeamPlansDir(): void { + fs.mkdirSync(userTeamPlansDir(), { recursive: true }); +} + +function isPlainObject(value: unknown): value is Record { + return Boolean(value) && typeof value === 'object' && !Array.isArray(value); +} + +function positiveInteger(value: unknown, field: string): number | undefined { + if (value === undefined || value === null || value === '') return undefined; + if (!Number.isInteger(value) || Number(value) < 1) { + throw new Error(`${field} 必须是大于或等于 1 的整数`); + } + return Number(value); +} + +function normalizeUserTeamShipTypes( + raw: unknown, + field: string, +): string[] | undefined { + if (raw === undefined || raw === null || raw === '') return undefined; + const values = typeof raw === 'string' ? [raw] : raw; + if (!Array.isArray(values) || values.length === 0) { + throw new Error(`${field} 必须是非空字符串列表`); + } + const result = values.map((value) => { + if (typeof value !== 'string' || !value.trim()) { + throw new Error(`${field} 必须是非空字符串列表`); + } + const shipType = value.trim().toLowerCase(); + if (!ALLOWED_FLEET_SHIP_TYPES.has(shipType)) { + throw new Error(`${field} 不符合后端接口: ${shipType}`); + } + return shipType; + }); + return [...new Set(result)]; +} + +/** 校验一艘主选或备选舰船自己的规则。 */ +function normalizeUserTeamShipRule( + raw: unknown, + field: string, +): UserTeamShipRule { + if (!isPlainObject(raw)) throw new Error(`${field} 必须是对象`); + const allowedKeys = new Set([ + 'name', + 'search_name', + 'ship_type', + 'min_level', + 'max_level', + ]); + if (Object.keys(raw).some(key => !allowedKeys.has(key))) { + throw new Error(`${field} 包含后端不支持的字段`); + } + if (typeof raw.name !== 'string' || !raw.name.trim()) { + throw new Error(`${field}.name 必须是非空字符串`); + } + + const result: UserTeamShipRule = { name: raw.name.trim() }; + if (raw.search_name !== undefined) { + if (typeof raw.search_name !== 'string' || !raw.search_name.trim()) { + throw new Error(`${field}.search_name 必须是非空字符串`); + } + result.search_name = raw.search_name.trim(); + } + const shipTypes = normalizeUserTeamShipTypes( + raw.ship_type, + `${field}.ship_type`, + ); + if (shipTypes) result.ship_type = shipTypes; + const minLevel = positiveInteger(raw.min_level, `${field}.min_level`); + const maxLevel = positiveInteger(raw.max_level, `${field}.max_level`); + if (minLevel !== undefined) result.min_level = minLevel; + if (maxLevel !== undefined) result.max_level = maxLevel; + if ( + minLevel !== undefined + && maxLevel !== undefined + && maxLevel < minLevel + ) { + throw new Error(`${field}.max_level 必须大于或等于 min_level`); + } + return result; +} + +/** 校验单个位置;主选可以为空,但位置必须至少包含一艘主选或备选。 */ +function normalizeUserTeamSlot(raw: unknown): UserTeamPlanSlot | null { + if (raw === null) return null; + if (!isPlainObject(raw)) throw new Error('ships 中的位置必须是对象'); + const allowedKeys = new Set([ + 'name', + 'candidates', + 'search_name', + 'ship_type', + 'min_level', + 'max_level', + ]); + if (Object.keys(raw).some(key => !allowedKeys.has(key))) { + throw new Error('位置包含后端不支持的字段'); + } + if (raw.candidates !== undefined && !Array.isArray(raw.candidates)) { + throw new Error('candidates 必须是列表'); + } + + const candidates = (raw.candidates ?? []).map( + (candidate: unknown, index: number) => normalizeUserTeamShipRule( + candidate, + `candidates[${index}]`, + ), + ); + const hasPrimary = typeof raw.name === 'string' && Boolean(raw.name.trim()); + if (!hasPrimary) { + if ( + raw.search_name !== undefined + || raw.ship_type !== undefined + || raw.min_level !== undefined + || raw.max_level !== undefined + ) { + throw new Error('没有主选 name 时不能填写主选规则'); + } + if (candidates.length === 0) { + throw new Error('位置至少需要一艘主选或备选舰船'); + } + return { candidates }; + } + + const { candidates: _ignored, ...primaryFields } = raw; + const result: UserTeamPlanSlot = { + ...normalizeUserTeamShipRule(primaryFields, '主选'), + }; + if (candidates.length > 0) result.candidates = candidates; + return result; +} + +/** 校验独立编队文件:一个名称对应一支最多六个位置的舰队。 */ +function normalizeUserTeamPlan(raw: unknown): UserTeamPlan { + if (!isPlainObject(raw)) throw new Error('编队 YAML 根节点必须是对象'); + const allowedKeys = new Set(['name', 'ships']); + if (Object.keys(raw).some(key => !allowedKeys.has(key))) { + throw new Error('编队 YAML 包含不支持的根字段'); + } + if (typeof raw.name !== 'string' || !raw.name.trim()) { + throw new Error('name 不能为空'); + } + if (!Array.isArray(raw.ships) || raw.ships.length < 1 || raw.ships.length > 6) { + throw new Error('ships 必须包含 1 到 6 个位置'); + } + const ships = raw.ships + .map(normalizeUserTeamSlot) + .filter((slot): slot is UserTeamPlanSlot => slot !== null); + if (ships.length === 0) { + throw new Error('ships 至少需要一个有效位置'); + } + return { name: raw.name.trim(), ships }; +} + +/** 使用行内 YAML 表示列表或备选对象,避免备选较多时纵向膨胀。 */ +function inlineYaml(value: unknown): string { + return yaml.dump(value, { + flowLevel: 0, + lineWidth: -1, + noRefs: true, + sortKeys: false, + }).trim(); +} + +/** 主选分行输出;纯备选位置不写 name,单个备选保持在同一行。 */ +function serializeUserTeamPlan(plan: UserTeamPlan): string { + const lines = [ + `name: ${inlineYaml(plan.name)}`, + 'ships:', + ]; + for (const slot of plan.ships) { + if (slot.name !== undefined) { + lines.push(` - name: ${inlineYaml(slot.name)}`); + if (slot.search_name !== undefined) { + lines.push(` search_name: ${inlineYaml(slot.search_name)}`); + } + if (slot.ship_type !== undefined) { + lines.push(` ship_type: ${inlineYaml(slot.ship_type)}`); + } + if (slot.min_level !== undefined) { + lines.push(` min_level: ${slot.min_level}`); + } + if (slot.max_level !== undefined) { + lines.push(` max_level: ${slot.max_level}`); + } + } + if (slot.candidates?.length) { + lines.push(slot.name === undefined ? ' - candidates:' : ' candidates:'); + for (const candidate of slot.candidates) { + lines.push(` - ${inlineYaml(candidate)}`); + } + } + } + return `${lines.join('\n')}\n`; +} + +function teamFileName(name: string): string { + const safeName = name + .trim() + .replace(/[<>:"/\\|?*\x00-\x1f]/g, '_') + .replace(/[. ]+$/g, '') + .slice(0, 80); + if (!safeName) throw new Error('编队预设名称不能用于文件名'); + return `team-${safeName}.yaml`; +} + +function atomicWrite(filePath: string, content: string): void { + const temporary = `${filePath}.${process.pid}.${Date.now()}.tmp`; + fs.writeFileSync(temporary, content, 'utf-8'); + try { + fs.renameSync(temporary, filePath); + } catch { + if (fs.existsSync(filePath)) fs.unlinkSync(filePath); + fs.renameSync(temporary, filePath); + } +} + +function readUserTeamPlan(filePath: string): UserTeamPlan { + return normalizeUserTeamPlan( + yaml.load(fs.readFileSync(filePath, 'utf-8')), + ); +} + +function yamlFiles(directory: string): string[] { + if (!fs.existsSync(directory)) return []; + return fs.readdirSync(directory) + .filter(file => /\.ya?ml$/i.test(file)) + .sort((left, right) => left.localeCompare(right, 'zh-CN')); +} + +/** 只列出用户编队目录中命名和内容均合法的编队文件。 */ +function listUserTeamPlans(): { + plans: UserTeamPlan[]; + errors: string[]; +} { + const directory = userTeamPlansDir(); + const plans: UserTeamPlan[] = []; + const errors: string[] = []; + for (const file of yamlFiles(directory)) { + if (!TEAM_FILE_PATTERN.test(file)) continue; + try { + const plan = readUserTeamPlan(path.join(directory, file)); + plans.push({ ...plan, file }); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + errors.push(`${file}: ${message}`); + } + } + return { plans, errors }; +} + +/** 读取清单,为配置页提供当前资料库状态。 */ +function getShipLibraryStatus(): ShipLibraryStatus { + const directory = shipLibraryDir(); + const manifestPath = path.join(directory, 'manifest.json'); + if (!fs.existsSync(manifestPath)) { + return { + exists: false, + path: directory, + shipCount: 0, + assetCount: 0, + missingAssets: 0, + }; + } + try { + const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as { + generated_at?: unknown; + counts?: Record; + }; + const counts = manifest.counts ?? {}; + return { + exists: true, + path: directory, + generatedAt: typeof manifest.generated_at === 'string' ? manifest.generated_at : undefined, + shipCount: typeof counts.ships === 'number' ? counts.ships : 0, + assetCount: typeof counts.assets === 'number' ? counts.assets : 0, + missingAssets: typeof counts.missing_assets === 'number' ? counts.missing_assets : 0, + }; + } catch (error) { + return { + exists: false, + path: directory, + shipCount: 0, + assetCount: 0, + missingAssets: 0, + error: `资料库清单读取失败: ${error instanceof Error ? error.message : String(error)}`, + }; + } +} + +function shipAssetUrl(relativePath: unknown): string { + if (typeof relativePath !== 'string' || !relativePath) return ''; + const root = path.resolve(shipLibraryDir()); + const absolutePath = path.resolve(root, relativePath); + if (absolutePath !== root && !absolutePath.startsWith(`${root}${path.sep}`)) return ''; + return pathToFileURL(absolutePath).href; +} + +/** 只向渲染进程提供舰队规划需要的清单字段和本地资源 URL。 */ +function getShipLibraryManifest(): ShipLibraryManifest { + const manifestPath = path.join(shipLibraryDir(), 'manifest.json'); + if (!fs.existsSync(manifestPath)) { + throw new Error('舰船资料库尚未建立,请先在配置页更新舰船数据库'); + } + const raw = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as { + schema_version?: unknown; + generated_at?: unknown; + labels?: unknown; + type_groups?: unknown; + ships?: unknown; + }; + if (!Array.isArray(raw.ships)) { + throw new Error('舰船资料库清单格式无效'); + } + return { + schemaVersion: typeof raw.schema_version === 'number' ? raw.schema_version : 0, + generatedAt: typeof raw.generated_at === 'string' ? raw.generated_at : '', + labels: raw.labels && typeof raw.labels === 'object' + ? raw.labels as Record + : {}, + typeGroups: raw.type_groups && typeof raw.type_groups === 'object' + ? raw.type_groups as Record + : {}, + ships: raw.ships.map((entry) => { + const ship = entry && typeof entry === 'object' + ? entry as Record + : {}; + return { + ...ship, + portraitUrl: shipAssetUrl(ship.portrait), + backgroundUrl: shipAssetUrl(ship.background), + frameUrl: shipAssetUrl(ship.frame), + typeIconUrl: shipAssetUrl(ship.type_icon), + }; + }), + }; +} + +function shipLibraryUpdaterPath(): string { + const root = isPackaged() ? resourceRoot() : appRoot(); + return path.join(root, 'tools', 'ship_library', 'update_ship_library.py'); +} + +function sendShipLibraryProgress(message: string): void { + mainWindow?.webContents.send('ship-library-update-progress', { message }); +} + +function runPython( + pythonCmd: string, + args: string[], +): Promise<{ code: number; output: string }> { + return new Promise((resolve) => { + const child = spawn(pythonCmd, args, { + cwd: appRoot(), + windowsHide: true, + env: pipEnv(), + }); + let output = ''; + child.stdout?.on('data', (chunk: Buffer) => { + output += chunk.toString(); + }); + child.stderr?.on('data', (chunk: Buffer) => { + output += chunk.toString(); + }); + child.once('error', (error) => { + resolve({ code: 1, output: error.message }); + }); + child.once('close', (code) => { + resolve({ code: code ?? 1, output }); + }); + }); +} + +function shipLibraryPythonBootstrap(): string { + const sitePackages = localSitePackages() + .replace(/\\/g, '\\\\') + .replace(/'/g, "\\'"); + return [ + 'import runpy, site, sys', + `sp = r'${sitePackages}'`, + 'sys.path.insert(0, sp)', + 'site.addsitedir(sp)', + 'script = sys.argv.pop(1)', + "runpy.run_path(script, run_name='__main__')", + ].join('; '); +} + +/** 确保更新器依赖安装在 GUI 自己的 Python 包目录中。 */ +async function ensureShipLibraryUpdaterDependencies( + pythonCmd: string, +): Promise { + const probe = await runPython(pythonCmd, [ + '-c', + [ + 'import site, sys', + `sp = r'${localSitePackages().replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`, + 'sys.path.insert(0, sp)', + 'site.addsitedir(sp)', + 'import requests, bs4', + ].join('; '), + ]); + if (probe.code === 0) return null; + + sendShipLibraryProgress('正在安装舰船数据库更新依赖…'); + if (!(await ensurePip(pythonCmd))) { + return '舰船数据库更新依赖安装失败:当前 Python 无法使用 pip'; + } + fs.mkdirSync(localSitePackages(), { recursive: true }); + const install = await runPython(pythonCmd, [ + '-m', + 'pip', + 'install', + '--target', + localSitePackages(), + 'requests', + 'beautifulsoup4', + ]); + if (install.code !== 0) { + return `舰船数据库更新依赖安装失败: ${install.output.trim().slice(-500)}`; + } + return null; +} + +/** 使用当前 GUI Python 环境执行增量更新,并解析脚本的机器可读结果。 */ +async function runShipLibraryUpdate(): Promise { + const pythonCmd = await findPython(); + if (!pythonCmd) { + return { success: false, error: '找不到可用的 Python 3.12 或 3.13' }; + } + const updaterPath = shipLibraryUpdaterPath(); + if (!fs.existsSync(updaterPath)) { + return { success: false, error: `找不到舰船资料库更新程序: ${updaterPath}` }; + } + const dependencyError = await ensureShipLibraryUpdaterDependencies(pythonCmd); + if (dependencyError) { + return { success: false, error: dependencyError }; + } + + return new Promise((resolve) => { + const child = spawn( + pythonCmd, + [ + '-c', + shipLibraryPythonBootstrap(), + updaterPath, + '--output', + shipLibraryDir(), + '--workers', + '8', + '--force-assets', + ], + { + cwd: appRoot(), + windowsHide: true, + env: pipEnv(), + }, + ); + let stdoutBuffer = ''; + let stderr = ''; + let result: ShipLibraryUpdateResult | null = null; + + const handleLine = (rawLine: string): void => { + const line = rawLine.trim(); + if (!line) return; + if (line.startsWith('PROGRESS sources')) { + sendShipLibraryProgress('正在获取舰R百科数据…'); + } else { + const records = line.match(/^PROGRESS records parsed=(\d+)$/); + const assets = line.match( + /^PROGRESS assets (\d+)\/(\d+) downloaded=(\d+) failed=(\d+)$/, + ); + if (records) { + sendShipLibraryProgress(`已读取 ${records[1]} 艘舰船,正在检查本地资源…`); + } else if (assets) { + sendShipLibraryProgress( + `正在检查资源 ${assets[1]}/${assets[2]},已下载 ${assets[3]},失败 ${assets[4]}`, + ); + } + } + if (line.startsWith('RESULT_JSON=')) { + try { + result = JSON.parse(line.slice('RESULT_JSON='.length)) as ShipLibraryUpdateResult; + } catch { + result = { success: false, error: '更新程序返回了无效结果' }; + } + } + }; + + child.stdout.setEncoding('utf-8'); + child.stdout.on('data', (chunk: string) => { + stdoutBuffer += chunk; + const lines = stdoutBuffer.split(/\r?\n/); + stdoutBuffer = lines.pop() ?? ''; + lines.forEach(handleLine); + }); + child.stderr.setEncoding('utf-8'); + child.stderr.on('data', (chunk: string) => { + stderr += chunk; + }); + child.once('error', (error) => { + resolve({ success: false, error: `更新程序启动失败: ${error.message}` }); + }); + child.once('close', (code) => { + if (stdoutBuffer) handleLine(stdoutBuffer); + resolve(result ?? { + success: false, + error: stderr.trim() || `更新程序异常退出(代码 ${code ?? 'unknown'})`, + }); + }); + }); +} + function createWindow(): BrowserWindow { const win = new BrowserWindow({ width: 1280, @@ -242,7 +864,7 @@ function createWindow(): BrowserWindow { responseHeaders: { ...details.responseHeaders, 'Content-Security-Policy': [ - `default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; connect-src 'self' http://localhost:${BACKEND_PORT} ws://localhost:${BACKEND_PORT}` + `default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; img-src 'self' file: data:; connect-src 'self' http://localhost:${BACKEND_PORT} ws://localhost:${BACKEND_PORT}` ], }, }); @@ -487,6 +1109,87 @@ ipcMain.handle('check-environment', async () => { return await checkEnvironment(); }); +ipcMain.handle('get-ship-library-status', () => { + return getShipLibraryStatus(); +}); + +ipcMain.handle('get-ship-library-manifest', () => { + return getShipLibraryManifest(); +}); + +ipcMain.handle('save-user-team-plan', ( + _event, + rawPlan: unknown, + overwrite: boolean, +) => { + try { + const plan = normalizeUserTeamPlan(rawPlan); + const file = teamFileName(plan.name); + const filePath = path.join(userTeamPlansDir(), file); + if (fs.existsSync(filePath) && overwrite !== true) { + return { + success: false, + exists: true, + file, + error: '存在同名配置', + }; + } + const content = serializeUserTeamPlan(plan); + atomicWrite(filePath, content); + return { success: true, file, plan: { ...plan, file } }; + } catch (error) { + return { + success: false, + error: error instanceof Error ? error.message : String(error), + }; + } +}); + +ipcMain.handle('pick-user-team-plan', async () => { + const directory = userTeamPlansDir(); + const result = await dialog.showOpenDialog({ + title: '加载编队预设', + defaultPath: directory, + properties: ['openFile'], + filters: [{ name: '编队 YAML', extensions: ['yaml', 'yml'] }], + }); + if (result.canceled || result.filePaths.length === 0) { + return { success: false, canceled: true }; + } + + const filePath = path.resolve(result.filePaths[0]); + const file = path.basename(filePath); + if ( + path.dirname(filePath).toLowerCase() !== path.resolve(directory).toLowerCase() + || !TEAM_FILE_PATTERN.test(file) + ) { + return { success: false, error: '当前yaml格式不符合规则' }; + } + try { + const plan = readUserTeamPlan(filePath); + return { success: true, file, plan: { ...plan, file } }; + } catch { + return { success: false, error: '当前yaml格式不符合规则' }; + } +}); + +ipcMain.handle('list-user-team-plans', () => { + return listUserTeamPlans(); +}); + +let shipLibraryUpdateRunning = false; +ipcMain.handle('update-ship-library', async () => { + if (shipLibraryUpdateRunning) { + return { success: false, error: '舰船资料库正在更新,请稍候' }; + } + shipLibraryUpdateRunning = true; + try { + return await runShipLibraryUpdate(); + } finally { + shipLibraryUpdateRunning = false; + } +}); + /* * 测试期接口(后端源码更新)已停用,逻辑保留便于回滚恢复。 ipcMain.handle('check-updates', async () => { @@ -612,6 +1315,8 @@ app.whenReady().then(() => { getMainWindow: () => mainWindow, }); initUserPlansDir(); + initUserShipLibraryDir(); + initUserTeamPlansDir(); initAutoUpdater(); createWindow(); diff --git a/electron/preload.ts b/electron/preload.ts index b75d86c..70929cd 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -188,6 +188,39 @@ contextBridge.exposeInMainWorld('electronBridge', { ipcRenderer.on('update-status', (_event, status) => callback(status)); }, + getShipLibraryStatus: () => { + return ipcRenderer.invoke('get-ship-library-status'); + }, + + getShipLibraryManifest: () => { + return ipcRenderer.invoke('get-ship-library-manifest'); + }, + + updateShipLibrary: () => { + return ipcRenderer.invoke('update-ship-library'); + }, + + onShipLibraryUpdateProgress: ( + callback: (progress: { message: string }) => void, + ) => { + ipcRenderer.on( + 'ship-library-update-progress', + (_event, progress) => callback(progress), + ); + }, + + saveUserTeamPlan: (plan: unknown, overwrite = false) => { + return ipcRenderer.invoke('save-user-team-plan', plan, overwrite); + }, + + pickUserTeamPlan: () => { + return ipcRenderer.invoke('pick-user-team-plan'); + }, + + listUserTeamPlans: () => { + return ipcRenderer.invoke('list-user-team-plans'); + }, + onBackendLog: (callback: (line: string) => void) => { ipcRenderer.on('backend-log', (_event, line: string) => callback(line)); }, diff --git a/package.json b/package.json index 2f1ca6b..5a5eed2 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,13 @@ "**/*" ] }, + { + "from": "tools/ship_library", + "to": "tools/ship_library", + "filter": [ + "update_ship_library.py" + ] + }, { "from": "setup.bat", "to": "setup.bat" diff --git a/resource/ship-library/assets/backgrounds/rarity-1.webp b/resource/ship-library/assets/backgrounds/rarity-1.webp new file mode 100644 index 0000000..1fe19dd Binary files /dev/null and b/resource/ship-library/assets/backgrounds/rarity-1.webp differ diff --git a/resource/ship-library/assets/backgrounds/rarity-2.webp b/resource/ship-library/assets/backgrounds/rarity-2.webp new file mode 100644 index 0000000..4077a33 Binary files /dev/null and b/resource/ship-library/assets/backgrounds/rarity-2.webp differ diff --git a/resource/ship-library/assets/backgrounds/rarity-3.webp b/resource/ship-library/assets/backgrounds/rarity-3.webp new file mode 100644 index 0000000..8b497ce Binary files /dev/null and b/resource/ship-library/assets/backgrounds/rarity-3.webp differ diff --git a/resource/ship-library/assets/backgrounds/rarity-4.webp b/resource/ship-library/assets/backgrounds/rarity-4.webp new file mode 100644 index 0000000..2f02c0f Binary files /dev/null and b/resource/ship-library/assets/backgrounds/rarity-4.webp differ diff --git a/resource/ship-library/assets/backgrounds/rarity-5.webp b/resource/ship-library/assets/backgrounds/rarity-5.webp new file mode 100644 index 0000000..b8308b1 Binary files /dev/null and b/resource/ship-library/assets/backgrounds/rarity-5.webp differ diff --git a/resource/ship-library/assets/backgrounds/rarity-6.webp b/resource/ship-library/assets/backgrounds/rarity-6.webp new file mode 100644 index 0000000..107afdc Binary files /dev/null and b/resource/ship-library/assets/backgrounds/rarity-6.webp differ diff --git a/resource/ship-library/assets/frames/rarity-1.webp b/resource/ship-library/assets/frames/rarity-1.webp new file mode 100644 index 0000000..b2912a1 Binary files /dev/null and b/resource/ship-library/assets/frames/rarity-1.webp differ diff --git a/resource/ship-library/assets/frames/rarity-2.webp b/resource/ship-library/assets/frames/rarity-2.webp new file mode 100644 index 0000000..0b595c6 Binary files /dev/null and b/resource/ship-library/assets/frames/rarity-2.webp differ diff --git a/resource/ship-library/assets/frames/rarity-3.webp b/resource/ship-library/assets/frames/rarity-3.webp new file mode 100644 index 0000000..77ba4cd Binary files /dev/null and b/resource/ship-library/assets/frames/rarity-3.webp differ diff --git a/resource/ship-library/assets/frames/rarity-4.webp b/resource/ship-library/assets/frames/rarity-4.webp new file mode 100644 index 0000000..bf7ba96 Binary files /dev/null and b/resource/ship-library/assets/frames/rarity-4.webp differ diff --git a/resource/ship-library/assets/frames/rarity-5.webp b/resource/ship-library/assets/frames/rarity-5.webp new file mode 100644 index 0000000..bd027a5 Binary files /dev/null and b/resource/ship-library/assets/frames/rarity-5.webp differ diff --git a/resource/ship-library/assets/frames/rarity-6.webp b/resource/ship-library/assets/frames/rarity-6.webp new file mode 100644 index 0000000..cf01e7a Binary files /dev/null and b/resource/ship-library/assets/frames/rarity-6.webp differ diff --git a/resource/ship-library/assets/portraits/1.webp b/resource/ship-library/assets/portraits/1.webp new file mode 100644 index 0000000..4c3b73b Binary files /dev/null and b/resource/ship-library/assets/portraits/1.webp differ diff --git a/resource/ship-library/assets/portraits/10.webp b/resource/ship-library/assets/portraits/10.webp new file mode 100644 index 0000000..6a8ba13 Binary files /dev/null and b/resource/ship-library/assets/portraits/10.webp differ diff --git a/resource/ship-library/assets/portraits/100.webp b/resource/ship-library/assets/portraits/100.webp new file mode 100644 index 0000000..dae8b97 Binary files /dev/null and b/resource/ship-library/assets/portraits/100.webp differ diff --git a/resource/ship-library/assets/portraits/1001.webp b/resource/ship-library/assets/portraits/1001.webp new file mode 100644 index 0000000..c0ebac6 Binary files /dev/null and b/resource/ship-library/assets/portraits/1001.webp differ diff --git a/resource/ship-library/assets/portraits/1002.webp b/resource/ship-library/assets/portraits/1002.webp new file mode 100644 index 0000000..10ee510 Binary files /dev/null and b/resource/ship-library/assets/portraits/1002.webp differ diff --git a/resource/ship-library/assets/portraits/1003.webp b/resource/ship-library/assets/portraits/1003.webp new file mode 100644 index 0000000..52de6f2 Binary files /dev/null and b/resource/ship-library/assets/portraits/1003.webp differ diff --git a/resource/ship-library/assets/portraits/1004.webp b/resource/ship-library/assets/portraits/1004.webp new file mode 100644 index 0000000..523fece Binary files /dev/null and b/resource/ship-library/assets/portraits/1004.webp differ diff --git a/resource/ship-library/assets/portraits/1005.webp b/resource/ship-library/assets/portraits/1005.webp new file mode 100644 index 0000000..2d4a15c Binary files /dev/null and b/resource/ship-library/assets/portraits/1005.webp differ diff --git a/resource/ship-library/assets/portraits/1006.webp b/resource/ship-library/assets/portraits/1006.webp new file mode 100644 index 0000000..491383e Binary files /dev/null and b/resource/ship-library/assets/portraits/1006.webp differ diff --git a/resource/ship-library/assets/portraits/1007.webp b/resource/ship-library/assets/portraits/1007.webp new file mode 100644 index 0000000..98e7169 Binary files /dev/null and b/resource/ship-library/assets/portraits/1007.webp differ diff --git a/resource/ship-library/assets/portraits/1008.webp b/resource/ship-library/assets/portraits/1008.webp new file mode 100644 index 0000000..55f829d Binary files /dev/null and b/resource/ship-library/assets/portraits/1008.webp differ diff --git a/resource/ship-library/assets/portraits/1009.webp b/resource/ship-library/assets/portraits/1009.webp new file mode 100644 index 0000000..76beee1 Binary files /dev/null and b/resource/ship-library/assets/portraits/1009.webp differ diff --git a/resource/ship-library/assets/portraits/101.webp b/resource/ship-library/assets/portraits/101.webp new file mode 100644 index 0000000..64a0c63 Binary files /dev/null and b/resource/ship-library/assets/portraits/101.webp differ diff --git a/resource/ship-library/assets/portraits/1010.webp b/resource/ship-library/assets/portraits/1010.webp new file mode 100644 index 0000000..4f93261 Binary files /dev/null and b/resource/ship-library/assets/portraits/1010.webp differ diff --git a/resource/ship-library/assets/portraits/1011.webp b/resource/ship-library/assets/portraits/1011.webp new file mode 100644 index 0000000..6057510 Binary files /dev/null and b/resource/ship-library/assets/portraits/1011.webp differ diff --git a/resource/ship-library/assets/portraits/1012.webp b/resource/ship-library/assets/portraits/1012.webp new file mode 100644 index 0000000..fdae8ad Binary files /dev/null and b/resource/ship-library/assets/portraits/1012.webp differ diff --git a/resource/ship-library/assets/portraits/1013.webp b/resource/ship-library/assets/portraits/1013.webp new file mode 100644 index 0000000..50950cc Binary files /dev/null and b/resource/ship-library/assets/portraits/1013.webp differ diff --git a/resource/ship-library/assets/portraits/1014.webp b/resource/ship-library/assets/portraits/1014.webp new file mode 100644 index 0000000..ce8fa8b Binary files /dev/null and b/resource/ship-library/assets/portraits/1014.webp differ diff --git a/resource/ship-library/assets/portraits/1018.webp b/resource/ship-library/assets/portraits/1018.webp new file mode 100644 index 0000000..816804a Binary files /dev/null and b/resource/ship-library/assets/portraits/1018.webp differ diff --git a/resource/ship-library/assets/portraits/1019.webp b/resource/ship-library/assets/portraits/1019.webp new file mode 100644 index 0000000..a307976 Binary files /dev/null and b/resource/ship-library/assets/portraits/1019.webp differ diff --git a/resource/ship-library/assets/portraits/102.webp b/resource/ship-library/assets/portraits/102.webp new file mode 100644 index 0000000..9037b6d Binary files /dev/null and b/resource/ship-library/assets/portraits/102.webp differ diff --git a/resource/ship-library/assets/portraits/1020.webp b/resource/ship-library/assets/portraits/1020.webp new file mode 100644 index 0000000..b29c022 Binary files /dev/null and b/resource/ship-library/assets/portraits/1020.webp differ diff --git a/resource/ship-library/assets/portraits/1021.webp b/resource/ship-library/assets/portraits/1021.webp new file mode 100644 index 0000000..021e53d Binary files /dev/null and b/resource/ship-library/assets/portraits/1021.webp differ diff --git a/resource/ship-library/assets/portraits/1022.webp b/resource/ship-library/assets/portraits/1022.webp new file mode 100644 index 0000000..aadb492 Binary files /dev/null and b/resource/ship-library/assets/portraits/1022.webp differ diff --git a/resource/ship-library/assets/portraits/1023.webp b/resource/ship-library/assets/portraits/1023.webp new file mode 100644 index 0000000..3e30e4e Binary files /dev/null and b/resource/ship-library/assets/portraits/1023.webp differ diff --git a/resource/ship-library/assets/portraits/1024.webp b/resource/ship-library/assets/portraits/1024.webp new file mode 100644 index 0000000..c687121 Binary files /dev/null and b/resource/ship-library/assets/portraits/1024.webp differ diff --git a/resource/ship-library/assets/portraits/1025.webp b/resource/ship-library/assets/portraits/1025.webp new file mode 100644 index 0000000..27cf46d Binary files /dev/null and b/resource/ship-library/assets/portraits/1025.webp differ diff --git a/resource/ship-library/assets/portraits/1026.webp b/resource/ship-library/assets/portraits/1026.webp new file mode 100644 index 0000000..ae514ef Binary files /dev/null and b/resource/ship-library/assets/portraits/1026.webp differ diff --git a/resource/ship-library/assets/portraits/1027.webp b/resource/ship-library/assets/portraits/1027.webp new file mode 100644 index 0000000..5c8dc82 Binary files /dev/null and b/resource/ship-library/assets/portraits/1027.webp differ diff --git a/resource/ship-library/assets/portraits/1028.webp b/resource/ship-library/assets/portraits/1028.webp new file mode 100644 index 0000000..fb64f32 Binary files /dev/null and b/resource/ship-library/assets/portraits/1028.webp differ diff --git a/resource/ship-library/assets/portraits/1029.webp b/resource/ship-library/assets/portraits/1029.webp new file mode 100644 index 0000000..0021810 Binary files /dev/null and b/resource/ship-library/assets/portraits/1029.webp differ diff --git a/resource/ship-library/assets/portraits/103.webp b/resource/ship-library/assets/portraits/103.webp new file mode 100644 index 0000000..d592244 Binary files /dev/null and b/resource/ship-library/assets/portraits/103.webp differ diff --git a/resource/ship-library/assets/portraits/1030.webp b/resource/ship-library/assets/portraits/1030.webp new file mode 100644 index 0000000..5466226 Binary files /dev/null and b/resource/ship-library/assets/portraits/1030.webp differ diff --git a/resource/ship-library/assets/portraits/1031.webp b/resource/ship-library/assets/portraits/1031.webp new file mode 100644 index 0000000..169e0bc Binary files /dev/null and b/resource/ship-library/assets/portraits/1031.webp differ diff --git a/resource/ship-library/assets/portraits/1032.webp b/resource/ship-library/assets/portraits/1032.webp new file mode 100644 index 0000000..27f6bc8 Binary files /dev/null and b/resource/ship-library/assets/portraits/1032.webp differ diff --git a/resource/ship-library/assets/portraits/1033.webp b/resource/ship-library/assets/portraits/1033.webp new file mode 100644 index 0000000..f6c9ad2 Binary files /dev/null and b/resource/ship-library/assets/portraits/1033.webp differ diff --git a/resource/ship-library/assets/portraits/1034.webp b/resource/ship-library/assets/portraits/1034.webp new file mode 100644 index 0000000..58e30a0 Binary files /dev/null and b/resource/ship-library/assets/portraits/1034.webp differ diff --git a/resource/ship-library/assets/portraits/1035.webp b/resource/ship-library/assets/portraits/1035.webp new file mode 100644 index 0000000..bc2bdf4 Binary files /dev/null and b/resource/ship-library/assets/portraits/1035.webp differ diff --git a/resource/ship-library/assets/portraits/1036.webp b/resource/ship-library/assets/portraits/1036.webp new file mode 100644 index 0000000..8efe63a Binary files /dev/null and b/resource/ship-library/assets/portraits/1036.webp differ diff --git a/resource/ship-library/assets/portraits/1037.webp b/resource/ship-library/assets/portraits/1037.webp new file mode 100644 index 0000000..b5f8173 Binary files /dev/null and b/resource/ship-library/assets/portraits/1037.webp differ diff --git a/resource/ship-library/assets/portraits/1038.webp b/resource/ship-library/assets/portraits/1038.webp new file mode 100644 index 0000000..44b2bbe Binary files /dev/null and b/resource/ship-library/assets/portraits/1038.webp differ diff --git a/resource/ship-library/assets/portraits/1039.webp b/resource/ship-library/assets/portraits/1039.webp new file mode 100644 index 0000000..ccfd465 Binary files /dev/null and b/resource/ship-library/assets/portraits/1039.webp differ diff --git a/resource/ship-library/assets/portraits/104.webp b/resource/ship-library/assets/portraits/104.webp new file mode 100644 index 0000000..461c49f Binary files /dev/null and b/resource/ship-library/assets/portraits/104.webp differ diff --git a/resource/ship-library/assets/portraits/1040.webp b/resource/ship-library/assets/portraits/1040.webp new file mode 100644 index 0000000..07a1546 Binary files /dev/null and b/resource/ship-library/assets/portraits/1040.webp differ diff --git a/resource/ship-library/assets/portraits/1041.webp b/resource/ship-library/assets/portraits/1041.webp new file mode 100644 index 0000000..978fdcc Binary files /dev/null and b/resource/ship-library/assets/portraits/1041.webp differ diff --git a/resource/ship-library/assets/portraits/1042.webp b/resource/ship-library/assets/portraits/1042.webp new file mode 100644 index 0000000..800ce1e Binary files /dev/null and b/resource/ship-library/assets/portraits/1042.webp differ diff --git a/resource/ship-library/assets/portraits/1043.webp b/resource/ship-library/assets/portraits/1043.webp new file mode 100644 index 0000000..35e69cb Binary files /dev/null and b/resource/ship-library/assets/portraits/1043.webp differ diff --git a/resource/ship-library/assets/portraits/1044.webp b/resource/ship-library/assets/portraits/1044.webp new file mode 100644 index 0000000..314fe03 Binary files /dev/null and b/resource/ship-library/assets/portraits/1044.webp differ diff --git a/resource/ship-library/assets/portraits/1045.webp b/resource/ship-library/assets/portraits/1045.webp new file mode 100644 index 0000000..3655a42 Binary files /dev/null and b/resource/ship-library/assets/portraits/1045.webp differ diff --git a/resource/ship-library/assets/portraits/1046.webp b/resource/ship-library/assets/portraits/1046.webp new file mode 100644 index 0000000..070ebec Binary files /dev/null and b/resource/ship-library/assets/portraits/1046.webp differ diff --git a/resource/ship-library/assets/portraits/1047.webp b/resource/ship-library/assets/portraits/1047.webp new file mode 100644 index 0000000..bb05179 Binary files /dev/null and b/resource/ship-library/assets/portraits/1047.webp differ diff --git a/resource/ship-library/assets/portraits/1048.webp b/resource/ship-library/assets/portraits/1048.webp new file mode 100644 index 0000000..086a9d5 Binary files /dev/null and b/resource/ship-library/assets/portraits/1048.webp differ diff --git a/resource/ship-library/assets/portraits/1049.webp b/resource/ship-library/assets/portraits/1049.webp new file mode 100644 index 0000000..40a7eeb Binary files /dev/null and b/resource/ship-library/assets/portraits/1049.webp differ diff --git a/resource/ship-library/assets/portraits/105.webp b/resource/ship-library/assets/portraits/105.webp new file mode 100644 index 0000000..899e642 Binary files /dev/null and b/resource/ship-library/assets/portraits/105.webp differ diff --git a/resource/ship-library/assets/portraits/1050.webp b/resource/ship-library/assets/portraits/1050.webp new file mode 100644 index 0000000..2bc6ce4 Binary files /dev/null and b/resource/ship-library/assets/portraits/1050.webp differ diff --git a/resource/ship-library/assets/portraits/1054.webp b/resource/ship-library/assets/portraits/1054.webp new file mode 100644 index 0000000..a8ab65a Binary files /dev/null and b/resource/ship-library/assets/portraits/1054.webp differ diff --git a/resource/ship-library/assets/portraits/1055.webp b/resource/ship-library/assets/portraits/1055.webp new file mode 100644 index 0000000..caca1ce Binary files /dev/null and b/resource/ship-library/assets/portraits/1055.webp differ diff --git a/resource/ship-library/assets/portraits/1056.webp b/resource/ship-library/assets/portraits/1056.webp new file mode 100644 index 0000000..b4365bc Binary files /dev/null and b/resource/ship-library/assets/portraits/1056.webp differ diff --git a/resource/ship-library/assets/portraits/1057.webp b/resource/ship-library/assets/portraits/1057.webp new file mode 100644 index 0000000..9ff1685 Binary files /dev/null and b/resource/ship-library/assets/portraits/1057.webp differ diff --git a/resource/ship-library/assets/portraits/1058.webp b/resource/ship-library/assets/portraits/1058.webp new file mode 100644 index 0000000..e30b055 Binary files /dev/null and b/resource/ship-library/assets/portraits/1058.webp differ diff --git a/resource/ship-library/assets/portraits/1059.webp b/resource/ship-library/assets/portraits/1059.webp new file mode 100644 index 0000000..bdde4ac Binary files /dev/null and b/resource/ship-library/assets/portraits/1059.webp differ diff --git a/resource/ship-library/assets/portraits/106.webp b/resource/ship-library/assets/portraits/106.webp new file mode 100644 index 0000000..edc6e6f Binary files /dev/null and b/resource/ship-library/assets/portraits/106.webp differ diff --git a/resource/ship-library/assets/portraits/1060.webp b/resource/ship-library/assets/portraits/1060.webp new file mode 100644 index 0000000..1b8c810 Binary files /dev/null and b/resource/ship-library/assets/portraits/1060.webp differ diff --git a/resource/ship-library/assets/portraits/1061.webp b/resource/ship-library/assets/portraits/1061.webp new file mode 100644 index 0000000..761c582 Binary files /dev/null and b/resource/ship-library/assets/portraits/1061.webp differ diff --git a/resource/ship-library/assets/portraits/1062.webp b/resource/ship-library/assets/portraits/1062.webp new file mode 100644 index 0000000..04c828f Binary files /dev/null and b/resource/ship-library/assets/portraits/1062.webp differ diff --git a/resource/ship-library/assets/portraits/1063.webp b/resource/ship-library/assets/portraits/1063.webp new file mode 100644 index 0000000..6c8f372 Binary files /dev/null and b/resource/ship-library/assets/portraits/1063.webp differ diff --git a/resource/ship-library/assets/portraits/1064.webp b/resource/ship-library/assets/portraits/1064.webp new file mode 100644 index 0000000..9d1cead Binary files /dev/null and b/resource/ship-library/assets/portraits/1064.webp differ diff --git a/resource/ship-library/assets/portraits/1065.webp b/resource/ship-library/assets/portraits/1065.webp new file mode 100644 index 0000000..ef3222f Binary files /dev/null and b/resource/ship-library/assets/portraits/1065.webp differ diff --git a/resource/ship-library/assets/portraits/1066.webp b/resource/ship-library/assets/portraits/1066.webp new file mode 100644 index 0000000..2f3901b Binary files /dev/null and b/resource/ship-library/assets/portraits/1066.webp differ diff --git a/resource/ship-library/assets/portraits/1067.webp b/resource/ship-library/assets/portraits/1067.webp new file mode 100644 index 0000000..d891477 Binary files /dev/null and b/resource/ship-library/assets/portraits/1067.webp differ diff --git a/resource/ship-library/assets/portraits/1068.webp b/resource/ship-library/assets/portraits/1068.webp new file mode 100644 index 0000000..3e57108 Binary files /dev/null and b/resource/ship-library/assets/portraits/1068.webp differ diff --git a/resource/ship-library/assets/portraits/1069.webp b/resource/ship-library/assets/portraits/1069.webp new file mode 100644 index 0000000..54b214d Binary files /dev/null and b/resource/ship-library/assets/portraits/1069.webp differ diff --git a/resource/ship-library/assets/portraits/107.webp b/resource/ship-library/assets/portraits/107.webp new file mode 100644 index 0000000..a7ba462 Binary files /dev/null and b/resource/ship-library/assets/portraits/107.webp differ diff --git a/resource/ship-library/assets/portraits/1070.webp b/resource/ship-library/assets/portraits/1070.webp new file mode 100644 index 0000000..f0c1c48 Binary files /dev/null and b/resource/ship-library/assets/portraits/1070.webp differ diff --git a/resource/ship-library/assets/portraits/1071.webp b/resource/ship-library/assets/portraits/1071.webp new file mode 100644 index 0000000..6dcb937 Binary files /dev/null and b/resource/ship-library/assets/portraits/1071.webp differ diff --git a/resource/ship-library/assets/portraits/1072.webp b/resource/ship-library/assets/portraits/1072.webp new file mode 100644 index 0000000..29a49db Binary files /dev/null and b/resource/ship-library/assets/portraits/1072.webp differ diff --git a/resource/ship-library/assets/portraits/1073.webp b/resource/ship-library/assets/portraits/1073.webp new file mode 100644 index 0000000..c82f9ea Binary files /dev/null and b/resource/ship-library/assets/portraits/1073.webp differ diff --git a/resource/ship-library/assets/portraits/1074.webp b/resource/ship-library/assets/portraits/1074.webp new file mode 100644 index 0000000..fd51777 Binary files /dev/null and b/resource/ship-library/assets/portraits/1074.webp differ diff --git a/resource/ship-library/assets/portraits/1075.webp b/resource/ship-library/assets/portraits/1075.webp new file mode 100644 index 0000000..159593d Binary files /dev/null and b/resource/ship-library/assets/portraits/1075.webp differ diff --git a/resource/ship-library/assets/portraits/1076.webp b/resource/ship-library/assets/portraits/1076.webp new file mode 100644 index 0000000..8b225c3 Binary files /dev/null and b/resource/ship-library/assets/portraits/1076.webp differ diff --git a/resource/ship-library/assets/portraits/1077.webp b/resource/ship-library/assets/portraits/1077.webp new file mode 100644 index 0000000..b87b585 Binary files /dev/null and b/resource/ship-library/assets/portraits/1077.webp differ diff --git a/resource/ship-library/assets/portraits/1079.webp b/resource/ship-library/assets/portraits/1079.webp new file mode 100644 index 0000000..a2807d6 Binary files /dev/null and b/resource/ship-library/assets/portraits/1079.webp differ diff --git a/resource/ship-library/assets/portraits/108.webp b/resource/ship-library/assets/portraits/108.webp new file mode 100644 index 0000000..d2475a3 Binary files /dev/null and b/resource/ship-library/assets/portraits/108.webp differ diff --git a/resource/ship-library/assets/portraits/1080.webp b/resource/ship-library/assets/portraits/1080.webp new file mode 100644 index 0000000..8b8d023 Binary files /dev/null and b/resource/ship-library/assets/portraits/1080.webp differ diff --git a/resource/ship-library/assets/portraits/1081.webp b/resource/ship-library/assets/portraits/1081.webp new file mode 100644 index 0000000..bb37233 Binary files /dev/null and b/resource/ship-library/assets/portraits/1081.webp differ diff --git a/resource/ship-library/assets/portraits/1082.webp b/resource/ship-library/assets/portraits/1082.webp new file mode 100644 index 0000000..d6ab3e5 Binary files /dev/null and b/resource/ship-library/assets/portraits/1082.webp differ diff --git a/resource/ship-library/assets/portraits/1083.webp b/resource/ship-library/assets/portraits/1083.webp new file mode 100644 index 0000000..f96e4c0 Binary files /dev/null and b/resource/ship-library/assets/portraits/1083.webp differ diff --git a/resource/ship-library/assets/portraits/1084.webp b/resource/ship-library/assets/portraits/1084.webp new file mode 100644 index 0000000..623b170 Binary files /dev/null and b/resource/ship-library/assets/portraits/1084.webp differ diff --git a/resource/ship-library/assets/portraits/1085.webp b/resource/ship-library/assets/portraits/1085.webp new file mode 100644 index 0000000..e610bf5 Binary files /dev/null and b/resource/ship-library/assets/portraits/1085.webp differ diff --git a/resource/ship-library/assets/portraits/1086.webp b/resource/ship-library/assets/portraits/1086.webp new file mode 100644 index 0000000..f630113 Binary files /dev/null and b/resource/ship-library/assets/portraits/1086.webp differ diff --git a/resource/ship-library/assets/portraits/1087.webp b/resource/ship-library/assets/portraits/1087.webp new file mode 100644 index 0000000..cf0c3e3 Binary files /dev/null and b/resource/ship-library/assets/portraits/1087.webp differ diff --git a/resource/ship-library/assets/portraits/1088.webp b/resource/ship-library/assets/portraits/1088.webp new file mode 100644 index 0000000..1286f78 Binary files /dev/null and b/resource/ship-library/assets/portraits/1088.webp differ diff --git a/resource/ship-library/assets/portraits/1089.webp b/resource/ship-library/assets/portraits/1089.webp new file mode 100644 index 0000000..1cf580e Binary files /dev/null and b/resource/ship-library/assets/portraits/1089.webp differ diff --git a/resource/ship-library/assets/portraits/109.webp b/resource/ship-library/assets/portraits/109.webp new file mode 100644 index 0000000..a684d19 Binary files /dev/null and b/resource/ship-library/assets/portraits/109.webp differ diff --git a/resource/ship-library/assets/portraits/1092.webp b/resource/ship-library/assets/portraits/1092.webp new file mode 100644 index 0000000..7fc1a1f Binary files /dev/null and b/resource/ship-library/assets/portraits/1092.webp differ diff --git a/resource/ship-library/assets/portraits/1093.webp b/resource/ship-library/assets/portraits/1093.webp new file mode 100644 index 0000000..3569775 Binary files /dev/null and b/resource/ship-library/assets/portraits/1093.webp differ diff --git a/resource/ship-library/assets/portraits/1094.webp b/resource/ship-library/assets/portraits/1094.webp new file mode 100644 index 0000000..00791a1 Binary files /dev/null and b/resource/ship-library/assets/portraits/1094.webp differ diff --git a/resource/ship-library/assets/portraits/1097.webp b/resource/ship-library/assets/portraits/1097.webp new file mode 100644 index 0000000..a88ccc6 Binary files /dev/null and b/resource/ship-library/assets/portraits/1097.webp differ diff --git a/resource/ship-library/assets/portraits/1098.webp b/resource/ship-library/assets/portraits/1098.webp new file mode 100644 index 0000000..6c3a27a Binary files /dev/null and b/resource/ship-library/assets/portraits/1098.webp differ diff --git a/resource/ship-library/assets/portraits/1099.webp b/resource/ship-library/assets/portraits/1099.webp new file mode 100644 index 0000000..58448b0 Binary files /dev/null and b/resource/ship-library/assets/portraits/1099.webp differ diff --git a/resource/ship-library/assets/portraits/11.webp b/resource/ship-library/assets/portraits/11.webp new file mode 100644 index 0000000..e402792 Binary files /dev/null and b/resource/ship-library/assets/portraits/11.webp differ diff --git a/resource/ship-library/assets/portraits/110.webp b/resource/ship-library/assets/portraits/110.webp new file mode 100644 index 0000000..a99039a Binary files /dev/null and b/resource/ship-library/assets/portraits/110.webp differ diff --git a/resource/ship-library/assets/portraits/1100.webp b/resource/ship-library/assets/portraits/1100.webp new file mode 100644 index 0000000..7677e3b Binary files /dev/null and b/resource/ship-library/assets/portraits/1100.webp differ diff --git a/resource/ship-library/assets/portraits/1101.webp b/resource/ship-library/assets/portraits/1101.webp new file mode 100644 index 0000000..c6afd79 Binary files /dev/null and b/resource/ship-library/assets/portraits/1101.webp differ diff --git a/resource/ship-library/assets/portraits/1102.webp b/resource/ship-library/assets/portraits/1102.webp new file mode 100644 index 0000000..c203eb1 Binary files /dev/null and b/resource/ship-library/assets/portraits/1102.webp differ diff --git a/resource/ship-library/assets/portraits/1105.webp b/resource/ship-library/assets/portraits/1105.webp new file mode 100644 index 0000000..05d2a66 Binary files /dev/null and b/resource/ship-library/assets/portraits/1105.webp differ diff --git a/resource/ship-library/assets/portraits/1106.webp b/resource/ship-library/assets/portraits/1106.webp new file mode 100644 index 0000000..629f369 Binary files /dev/null and b/resource/ship-library/assets/portraits/1106.webp differ diff --git a/resource/ship-library/assets/portraits/1107.webp b/resource/ship-library/assets/portraits/1107.webp new file mode 100644 index 0000000..9247905 Binary files /dev/null and b/resource/ship-library/assets/portraits/1107.webp differ diff --git a/resource/ship-library/assets/portraits/1108.webp b/resource/ship-library/assets/portraits/1108.webp new file mode 100644 index 0000000..f4356ff Binary files /dev/null and b/resource/ship-library/assets/portraits/1108.webp differ diff --git a/resource/ship-library/assets/portraits/1109.webp b/resource/ship-library/assets/portraits/1109.webp new file mode 100644 index 0000000..74ade36 Binary files /dev/null and b/resource/ship-library/assets/portraits/1109.webp differ diff --git a/resource/ship-library/assets/portraits/111.webp b/resource/ship-library/assets/portraits/111.webp new file mode 100644 index 0000000..afa5941 Binary files /dev/null and b/resource/ship-library/assets/portraits/111.webp differ diff --git a/resource/ship-library/assets/portraits/1110.webp b/resource/ship-library/assets/portraits/1110.webp new file mode 100644 index 0000000..016dfce Binary files /dev/null and b/resource/ship-library/assets/portraits/1110.webp differ diff --git a/resource/ship-library/assets/portraits/1111.webp b/resource/ship-library/assets/portraits/1111.webp new file mode 100644 index 0000000..c57d635 Binary files /dev/null and b/resource/ship-library/assets/portraits/1111.webp differ diff --git a/resource/ship-library/assets/portraits/1112.webp b/resource/ship-library/assets/portraits/1112.webp new file mode 100644 index 0000000..ae107ff Binary files /dev/null and b/resource/ship-library/assets/portraits/1112.webp differ diff --git a/resource/ship-library/assets/portraits/1113.webp b/resource/ship-library/assets/portraits/1113.webp new file mode 100644 index 0000000..ea6895b Binary files /dev/null and b/resource/ship-library/assets/portraits/1113.webp differ diff --git a/resource/ship-library/assets/portraits/1117.webp b/resource/ship-library/assets/portraits/1117.webp new file mode 100644 index 0000000..3448461 Binary files /dev/null and b/resource/ship-library/assets/portraits/1117.webp differ diff --git a/resource/ship-library/assets/portraits/1118.webp b/resource/ship-library/assets/portraits/1118.webp new file mode 100644 index 0000000..5e229da Binary files /dev/null and b/resource/ship-library/assets/portraits/1118.webp differ diff --git a/resource/ship-library/assets/portraits/112.webp b/resource/ship-library/assets/portraits/112.webp new file mode 100644 index 0000000..307f7b8 Binary files /dev/null and b/resource/ship-library/assets/portraits/112.webp differ diff --git a/resource/ship-library/assets/portraits/1120.webp b/resource/ship-library/assets/portraits/1120.webp new file mode 100644 index 0000000..278e968 Binary files /dev/null and b/resource/ship-library/assets/portraits/1120.webp differ diff --git a/resource/ship-library/assets/portraits/1121.webp b/resource/ship-library/assets/portraits/1121.webp new file mode 100644 index 0000000..b19cfef Binary files /dev/null and b/resource/ship-library/assets/portraits/1121.webp differ diff --git a/resource/ship-library/assets/portraits/1123.webp b/resource/ship-library/assets/portraits/1123.webp new file mode 100644 index 0000000..5b06121 Binary files /dev/null and b/resource/ship-library/assets/portraits/1123.webp differ diff --git a/resource/ship-library/assets/portraits/1124.webp b/resource/ship-library/assets/portraits/1124.webp new file mode 100644 index 0000000..cae677f Binary files /dev/null and b/resource/ship-library/assets/portraits/1124.webp differ diff --git a/resource/ship-library/assets/portraits/1125.webp b/resource/ship-library/assets/portraits/1125.webp new file mode 100644 index 0000000..38434b0 Binary files /dev/null and b/resource/ship-library/assets/portraits/1125.webp differ diff --git a/resource/ship-library/assets/portraits/1126.webp b/resource/ship-library/assets/portraits/1126.webp new file mode 100644 index 0000000..b8884bf Binary files /dev/null and b/resource/ship-library/assets/portraits/1126.webp differ diff --git a/resource/ship-library/assets/portraits/113.webp b/resource/ship-library/assets/portraits/113.webp new file mode 100644 index 0000000..f1a79bc Binary files /dev/null and b/resource/ship-library/assets/portraits/113.webp differ diff --git a/resource/ship-library/assets/portraits/1130.webp b/resource/ship-library/assets/portraits/1130.webp new file mode 100644 index 0000000..81773a7 Binary files /dev/null and b/resource/ship-library/assets/portraits/1130.webp differ diff --git a/resource/ship-library/assets/portraits/1131.webp b/resource/ship-library/assets/portraits/1131.webp new file mode 100644 index 0000000..7a21f02 Binary files /dev/null and b/resource/ship-library/assets/portraits/1131.webp differ diff --git a/resource/ship-library/assets/portraits/1132.webp b/resource/ship-library/assets/portraits/1132.webp new file mode 100644 index 0000000..cefbed7 Binary files /dev/null and b/resource/ship-library/assets/portraits/1132.webp differ diff --git a/resource/ship-library/assets/portraits/1133.webp b/resource/ship-library/assets/portraits/1133.webp new file mode 100644 index 0000000..de6de7c Binary files /dev/null and b/resource/ship-library/assets/portraits/1133.webp differ diff --git a/resource/ship-library/assets/portraits/1135.webp b/resource/ship-library/assets/portraits/1135.webp new file mode 100644 index 0000000..96e0715 Binary files /dev/null and b/resource/ship-library/assets/portraits/1135.webp differ diff --git a/resource/ship-library/assets/portraits/1136.webp b/resource/ship-library/assets/portraits/1136.webp new file mode 100644 index 0000000..85bea33 Binary files /dev/null and b/resource/ship-library/assets/portraits/1136.webp differ diff --git a/resource/ship-library/assets/portraits/1137.webp b/resource/ship-library/assets/portraits/1137.webp new file mode 100644 index 0000000..c6ce219 Binary files /dev/null and b/resource/ship-library/assets/portraits/1137.webp differ diff --git a/resource/ship-library/assets/portraits/1139.webp b/resource/ship-library/assets/portraits/1139.webp new file mode 100644 index 0000000..0bc80ee Binary files /dev/null and b/resource/ship-library/assets/portraits/1139.webp differ diff --git a/resource/ship-library/assets/portraits/114.webp b/resource/ship-library/assets/portraits/114.webp new file mode 100644 index 0000000..de21ae8 Binary files /dev/null and b/resource/ship-library/assets/portraits/114.webp differ diff --git a/resource/ship-library/assets/portraits/1141.webp b/resource/ship-library/assets/portraits/1141.webp new file mode 100644 index 0000000..15c3b49 Binary files /dev/null and b/resource/ship-library/assets/portraits/1141.webp differ diff --git a/resource/ship-library/assets/portraits/1142.webp b/resource/ship-library/assets/portraits/1142.webp new file mode 100644 index 0000000..289d7d2 Binary files /dev/null and b/resource/ship-library/assets/portraits/1142.webp differ diff --git a/resource/ship-library/assets/portraits/1143.webp b/resource/ship-library/assets/portraits/1143.webp new file mode 100644 index 0000000..169501d Binary files /dev/null and b/resource/ship-library/assets/portraits/1143.webp differ diff --git a/resource/ship-library/assets/portraits/1145.webp b/resource/ship-library/assets/portraits/1145.webp new file mode 100644 index 0000000..a1c68a7 Binary files /dev/null and b/resource/ship-library/assets/portraits/1145.webp differ diff --git a/resource/ship-library/assets/portraits/1149.webp b/resource/ship-library/assets/portraits/1149.webp new file mode 100644 index 0000000..c399e99 Binary files /dev/null and b/resource/ship-library/assets/portraits/1149.webp differ diff --git a/resource/ship-library/assets/portraits/115.webp b/resource/ship-library/assets/portraits/115.webp new file mode 100644 index 0000000..0109a79 Binary files /dev/null and b/resource/ship-library/assets/portraits/115.webp differ diff --git a/resource/ship-library/assets/portraits/1150.webp b/resource/ship-library/assets/portraits/1150.webp new file mode 100644 index 0000000..02db4e6 Binary files /dev/null and b/resource/ship-library/assets/portraits/1150.webp differ diff --git a/resource/ship-library/assets/portraits/1151.webp b/resource/ship-library/assets/portraits/1151.webp new file mode 100644 index 0000000..5b86446 Binary files /dev/null and b/resource/ship-library/assets/portraits/1151.webp differ diff --git a/resource/ship-library/assets/portraits/1158.webp b/resource/ship-library/assets/portraits/1158.webp new file mode 100644 index 0000000..72b4d9b Binary files /dev/null and b/resource/ship-library/assets/portraits/1158.webp differ diff --git a/resource/ship-library/assets/portraits/1160.webp b/resource/ship-library/assets/portraits/1160.webp new file mode 100644 index 0000000..0ec6be5 Binary files /dev/null and b/resource/ship-library/assets/portraits/1160.webp differ diff --git a/resource/ship-library/assets/portraits/1162.webp b/resource/ship-library/assets/portraits/1162.webp new file mode 100644 index 0000000..518dc1e Binary files /dev/null and b/resource/ship-library/assets/portraits/1162.webp differ diff --git a/resource/ship-library/assets/portraits/1164.webp b/resource/ship-library/assets/portraits/1164.webp new file mode 100644 index 0000000..257928c Binary files /dev/null and b/resource/ship-library/assets/portraits/1164.webp differ diff --git a/resource/ship-library/assets/portraits/1165.webp b/resource/ship-library/assets/portraits/1165.webp new file mode 100644 index 0000000..376ad41 Binary files /dev/null and b/resource/ship-library/assets/portraits/1165.webp differ diff --git a/resource/ship-library/assets/portraits/1166.webp b/resource/ship-library/assets/portraits/1166.webp new file mode 100644 index 0000000..5534a58 Binary files /dev/null and b/resource/ship-library/assets/portraits/1166.webp differ diff --git a/resource/ship-library/assets/portraits/1167.webp b/resource/ship-library/assets/portraits/1167.webp new file mode 100644 index 0000000..2a92899 Binary files /dev/null and b/resource/ship-library/assets/portraits/1167.webp differ diff --git a/resource/ship-library/assets/portraits/1168.webp b/resource/ship-library/assets/portraits/1168.webp new file mode 100644 index 0000000..8fd94b1 Binary files /dev/null and b/resource/ship-library/assets/portraits/1168.webp differ diff --git a/resource/ship-library/assets/portraits/1169.webp b/resource/ship-library/assets/portraits/1169.webp new file mode 100644 index 0000000..1a367d3 Binary files /dev/null and b/resource/ship-library/assets/portraits/1169.webp differ diff --git a/resource/ship-library/assets/portraits/117.webp b/resource/ship-library/assets/portraits/117.webp new file mode 100644 index 0000000..0a4a292 Binary files /dev/null and b/resource/ship-library/assets/portraits/117.webp differ diff --git a/resource/ship-library/assets/portraits/1171.webp b/resource/ship-library/assets/portraits/1171.webp new file mode 100644 index 0000000..d119943 Binary files /dev/null and b/resource/ship-library/assets/portraits/1171.webp differ diff --git a/resource/ship-library/assets/portraits/1175.webp b/resource/ship-library/assets/portraits/1175.webp new file mode 100644 index 0000000..c2fc61b Binary files /dev/null and b/resource/ship-library/assets/portraits/1175.webp differ diff --git a/resource/ship-library/assets/portraits/1178.webp b/resource/ship-library/assets/portraits/1178.webp new file mode 100644 index 0000000..70872aa Binary files /dev/null and b/resource/ship-library/assets/portraits/1178.webp differ diff --git a/resource/ship-library/assets/portraits/118.webp b/resource/ship-library/assets/portraits/118.webp new file mode 100644 index 0000000..c3eb878 Binary files /dev/null and b/resource/ship-library/assets/portraits/118.webp differ diff --git a/resource/ship-library/assets/portraits/1181.webp b/resource/ship-library/assets/portraits/1181.webp new file mode 100644 index 0000000..a566fa9 Binary files /dev/null and b/resource/ship-library/assets/portraits/1181.webp differ diff --git a/resource/ship-library/assets/portraits/1182.webp b/resource/ship-library/assets/portraits/1182.webp new file mode 100644 index 0000000..3213541 Binary files /dev/null and b/resource/ship-library/assets/portraits/1182.webp differ diff --git a/resource/ship-library/assets/portraits/1183.webp b/resource/ship-library/assets/portraits/1183.webp new file mode 100644 index 0000000..c7846e4 Binary files /dev/null and b/resource/ship-library/assets/portraits/1183.webp differ diff --git a/resource/ship-library/assets/portraits/1185.webp b/resource/ship-library/assets/portraits/1185.webp new file mode 100644 index 0000000..a7ace90 Binary files /dev/null and b/resource/ship-library/assets/portraits/1185.webp differ diff --git a/resource/ship-library/assets/portraits/1187.webp b/resource/ship-library/assets/portraits/1187.webp new file mode 100644 index 0000000..ed40bf8 Binary files /dev/null and b/resource/ship-library/assets/portraits/1187.webp differ diff --git a/resource/ship-library/assets/portraits/1188.webp b/resource/ship-library/assets/portraits/1188.webp new file mode 100644 index 0000000..1d79290 Binary files /dev/null and b/resource/ship-library/assets/portraits/1188.webp differ diff --git a/resource/ship-library/assets/portraits/119.webp b/resource/ship-library/assets/portraits/119.webp new file mode 100644 index 0000000..1d4efee Binary files /dev/null and b/resource/ship-library/assets/portraits/119.webp differ diff --git a/resource/ship-library/assets/portraits/1192.webp b/resource/ship-library/assets/portraits/1192.webp new file mode 100644 index 0000000..6032acf Binary files /dev/null and b/resource/ship-library/assets/portraits/1192.webp differ diff --git a/resource/ship-library/assets/portraits/1194.webp b/resource/ship-library/assets/portraits/1194.webp new file mode 100644 index 0000000..42e03cf Binary files /dev/null and b/resource/ship-library/assets/portraits/1194.webp differ diff --git a/resource/ship-library/assets/portraits/1195.webp b/resource/ship-library/assets/portraits/1195.webp new file mode 100644 index 0000000..3ca8c54 Binary files /dev/null and b/resource/ship-library/assets/portraits/1195.webp differ diff --git a/resource/ship-library/assets/portraits/1197.webp b/resource/ship-library/assets/portraits/1197.webp new file mode 100644 index 0000000..21c3ec1 Binary files /dev/null and b/resource/ship-library/assets/portraits/1197.webp differ diff --git a/resource/ship-library/assets/portraits/1198.webp b/resource/ship-library/assets/portraits/1198.webp new file mode 100644 index 0000000..1c942b0 Binary files /dev/null and b/resource/ship-library/assets/portraits/1198.webp differ diff --git a/resource/ship-library/assets/portraits/1199.webp b/resource/ship-library/assets/portraits/1199.webp new file mode 100644 index 0000000..15c235a Binary files /dev/null and b/resource/ship-library/assets/portraits/1199.webp differ diff --git a/resource/ship-library/assets/portraits/12.webp b/resource/ship-library/assets/portraits/12.webp new file mode 100644 index 0000000..4ca428c Binary files /dev/null and b/resource/ship-library/assets/portraits/12.webp differ diff --git a/resource/ship-library/assets/portraits/120.webp b/resource/ship-library/assets/portraits/120.webp new file mode 100644 index 0000000..3be67bf Binary files /dev/null and b/resource/ship-library/assets/portraits/120.webp differ diff --git a/resource/ship-library/assets/portraits/1205.webp b/resource/ship-library/assets/portraits/1205.webp new file mode 100644 index 0000000..c4bf80c Binary files /dev/null and b/resource/ship-library/assets/portraits/1205.webp differ diff --git a/resource/ship-library/assets/portraits/1206.webp b/resource/ship-library/assets/portraits/1206.webp new file mode 100644 index 0000000..7d152fe Binary files /dev/null and b/resource/ship-library/assets/portraits/1206.webp differ diff --git a/resource/ship-library/assets/portraits/1207.webp b/resource/ship-library/assets/portraits/1207.webp new file mode 100644 index 0000000..61cd8fa Binary files /dev/null and b/resource/ship-library/assets/portraits/1207.webp differ diff --git a/resource/ship-library/assets/portraits/1209.webp b/resource/ship-library/assets/portraits/1209.webp new file mode 100644 index 0000000..1c4524c Binary files /dev/null and b/resource/ship-library/assets/portraits/1209.webp differ diff --git a/resource/ship-library/assets/portraits/121.webp b/resource/ship-library/assets/portraits/121.webp new file mode 100644 index 0000000..4d8bbf1 Binary files /dev/null and b/resource/ship-library/assets/portraits/121.webp differ diff --git a/resource/ship-library/assets/portraits/1211.webp b/resource/ship-library/assets/portraits/1211.webp new file mode 100644 index 0000000..b4da38f Binary files /dev/null and b/resource/ship-library/assets/portraits/1211.webp differ diff --git a/resource/ship-library/assets/portraits/1215.webp b/resource/ship-library/assets/portraits/1215.webp new file mode 100644 index 0000000..f9cc65e Binary files /dev/null and b/resource/ship-library/assets/portraits/1215.webp differ diff --git a/resource/ship-library/assets/portraits/1219.webp b/resource/ship-library/assets/portraits/1219.webp new file mode 100644 index 0000000..a4f5dbc Binary files /dev/null and b/resource/ship-library/assets/portraits/1219.webp differ diff --git a/resource/ship-library/assets/portraits/122.webp b/resource/ship-library/assets/portraits/122.webp new file mode 100644 index 0000000..43c98dc Binary files /dev/null and b/resource/ship-library/assets/portraits/122.webp differ diff --git a/resource/ship-library/assets/portraits/1220.webp b/resource/ship-library/assets/portraits/1220.webp new file mode 100644 index 0000000..306b5c4 Binary files /dev/null and b/resource/ship-library/assets/portraits/1220.webp differ diff --git a/resource/ship-library/assets/portraits/1221.webp b/resource/ship-library/assets/portraits/1221.webp new file mode 100644 index 0000000..b24a6b6 Binary files /dev/null and b/resource/ship-library/assets/portraits/1221.webp differ diff --git a/resource/ship-library/assets/portraits/1222.webp b/resource/ship-library/assets/portraits/1222.webp new file mode 100644 index 0000000..b986bf2 Binary files /dev/null and b/resource/ship-library/assets/portraits/1222.webp differ diff --git a/resource/ship-library/assets/portraits/1223.webp b/resource/ship-library/assets/portraits/1223.webp new file mode 100644 index 0000000..1b1653d Binary files /dev/null and b/resource/ship-library/assets/portraits/1223.webp differ diff --git a/resource/ship-library/assets/portraits/1224.webp b/resource/ship-library/assets/portraits/1224.webp new file mode 100644 index 0000000..2bd4905 Binary files /dev/null and b/resource/ship-library/assets/portraits/1224.webp differ diff --git a/resource/ship-library/assets/portraits/1225.webp b/resource/ship-library/assets/portraits/1225.webp new file mode 100644 index 0000000..51ccb90 Binary files /dev/null and b/resource/ship-library/assets/portraits/1225.webp differ diff --git a/resource/ship-library/assets/portraits/1227.webp b/resource/ship-library/assets/portraits/1227.webp new file mode 100644 index 0000000..9358099 Binary files /dev/null and b/resource/ship-library/assets/portraits/1227.webp differ diff --git a/resource/ship-library/assets/portraits/1228.webp b/resource/ship-library/assets/portraits/1228.webp new file mode 100644 index 0000000..9757259 Binary files /dev/null and b/resource/ship-library/assets/portraits/1228.webp differ diff --git a/resource/ship-library/assets/portraits/123.webp b/resource/ship-library/assets/portraits/123.webp new file mode 100644 index 0000000..ba36ee7 Binary files /dev/null and b/resource/ship-library/assets/portraits/123.webp differ diff --git a/resource/ship-library/assets/portraits/1232.webp b/resource/ship-library/assets/portraits/1232.webp new file mode 100644 index 0000000..782bb91 Binary files /dev/null and b/resource/ship-library/assets/portraits/1232.webp differ diff --git a/resource/ship-library/assets/portraits/1233.webp b/resource/ship-library/assets/portraits/1233.webp new file mode 100644 index 0000000..40be9c2 Binary files /dev/null and b/resource/ship-library/assets/portraits/1233.webp differ diff --git a/resource/ship-library/assets/portraits/1238.webp b/resource/ship-library/assets/portraits/1238.webp new file mode 100644 index 0000000..08b21ba Binary files /dev/null and b/resource/ship-library/assets/portraits/1238.webp differ diff --git a/resource/ship-library/assets/portraits/1239.webp b/resource/ship-library/assets/portraits/1239.webp new file mode 100644 index 0000000..3f555d6 Binary files /dev/null and b/resource/ship-library/assets/portraits/1239.webp differ diff --git a/resource/ship-library/assets/portraits/124.webp b/resource/ship-library/assets/portraits/124.webp new file mode 100644 index 0000000..4760609 Binary files /dev/null and b/resource/ship-library/assets/portraits/124.webp differ diff --git a/resource/ship-library/assets/portraits/1240.webp b/resource/ship-library/assets/portraits/1240.webp new file mode 100644 index 0000000..f714b80 Binary files /dev/null and b/resource/ship-library/assets/portraits/1240.webp differ diff --git a/resource/ship-library/assets/portraits/1241.webp b/resource/ship-library/assets/portraits/1241.webp new file mode 100644 index 0000000..3057785 Binary files /dev/null and b/resource/ship-library/assets/portraits/1241.webp differ diff --git a/resource/ship-library/assets/portraits/1244.webp b/resource/ship-library/assets/portraits/1244.webp new file mode 100644 index 0000000..bd130c1 Binary files /dev/null and b/resource/ship-library/assets/portraits/1244.webp differ diff --git a/resource/ship-library/assets/portraits/1247.webp b/resource/ship-library/assets/portraits/1247.webp new file mode 100644 index 0000000..acfa3b4 Binary files /dev/null and b/resource/ship-library/assets/portraits/1247.webp differ diff --git a/resource/ship-library/assets/portraits/1248.webp b/resource/ship-library/assets/portraits/1248.webp new file mode 100644 index 0000000..02a0d5a Binary files /dev/null and b/resource/ship-library/assets/portraits/1248.webp differ diff --git a/resource/ship-library/assets/portraits/1249.webp b/resource/ship-library/assets/portraits/1249.webp new file mode 100644 index 0000000..ad762a9 Binary files /dev/null and b/resource/ship-library/assets/portraits/1249.webp differ diff --git a/resource/ship-library/assets/portraits/125.webp b/resource/ship-library/assets/portraits/125.webp new file mode 100644 index 0000000..11f0ff3 Binary files /dev/null and b/resource/ship-library/assets/portraits/125.webp differ diff --git a/resource/ship-library/assets/portraits/1258.webp b/resource/ship-library/assets/portraits/1258.webp new file mode 100644 index 0000000..36d232d Binary files /dev/null and b/resource/ship-library/assets/portraits/1258.webp differ diff --git a/resource/ship-library/assets/portraits/126.webp b/resource/ship-library/assets/portraits/126.webp new file mode 100644 index 0000000..f7a1302 Binary files /dev/null and b/resource/ship-library/assets/portraits/126.webp differ diff --git a/resource/ship-library/assets/portraits/1265.webp b/resource/ship-library/assets/portraits/1265.webp new file mode 100644 index 0000000..60f303f Binary files /dev/null and b/resource/ship-library/assets/portraits/1265.webp differ diff --git a/resource/ship-library/assets/portraits/1266.webp b/resource/ship-library/assets/portraits/1266.webp new file mode 100644 index 0000000..63e02ec Binary files /dev/null and b/resource/ship-library/assets/portraits/1266.webp differ diff --git a/resource/ship-library/assets/portraits/1267.webp b/resource/ship-library/assets/portraits/1267.webp new file mode 100644 index 0000000..cc16f76 Binary files /dev/null and b/resource/ship-library/assets/portraits/1267.webp differ diff --git a/resource/ship-library/assets/portraits/1269.webp b/resource/ship-library/assets/portraits/1269.webp new file mode 100644 index 0000000..030b557 Binary files /dev/null and b/resource/ship-library/assets/portraits/1269.webp differ diff --git a/resource/ship-library/assets/portraits/127.webp b/resource/ship-library/assets/portraits/127.webp new file mode 100644 index 0000000..7d39cea Binary files /dev/null and b/resource/ship-library/assets/portraits/127.webp differ diff --git a/resource/ship-library/assets/portraits/1270.webp b/resource/ship-library/assets/portraits/1270.webp new file mode 100644 index 0000000..3de6199 Binary files /dev/null and b/resource/ship-library/assets/portraits/1270.webp differ diff --git a/resource/ship-library/assets/portraits/1273.webp b/resource/ship-library/assets/portraits/1273.webp new file mode 100644 index 0000000..880f24f Binary files /dev/null and b/resource/ship-library/assets/portraits/1273.webp differ diff --git a/resource/ship-library/assets/portraits/1275.webp b/resource/ship-library/assets/portraits/1275.webp new file mode 100644 index 0000000..52a93de Binary files /dev/null and b/resource/ship-library/assets/portraits/1275.webp differ diff --git a/resource/ship-library/assets/portraits/1277.webp b/resource/ship-library/assets/portraits/1277.webp new file mode 100644 index 0000000..7c8d11a Binary files /dev/null and b/resource/ship-library/assets/portraits/1277.webp differ diff --git a/resource/ship-library/assets/portraits/1278.webp b/resource/ship-library/assets/portraits/1278.webp new file mode 100644 index 0000000..fe55d44 Binary files /dev/null and b/resource/ship-library/assets/portraits/1278.webp differ diff --git a/resource/ship-library/assets/portraits/1279.webp b/resource/ship-library/assets/portraits/1279.webp new file mode 100644 index 0000000..00784f4 Binary files /dev/null and b/resource/ship-library/assets/portraits/1279.webp differ diff --git a/resource/ship-library/assets/portraits/128.webp b/resource/ship-library/assets/portraits/128.webp new file mode 100644 index 0000000..b4c2242 Binary files /dev/null and b/resource/ship-library/assets/portraits/128.webp differ diff --git a/resource/ship-library/assets/portraits/1280.webp b/resource/ship-library/assets/portraits/1280.webp new file mode 100644 index 0000000..ef0f985 Binary files /dev/null and b/resource/ship-library/assets/portraits/1280.webp differ diff --git a/resource/ship-library/assets/portraits/1289.webp b/resource/ship-library/assets/portraits/1289.webp new file mode 100644 index 0000000..ba60a92 Binary files /dev/null and b/resource/ship-library/assets/portraits/1289.webp differ diff --git a/resource/ship-library/assets/portraits/129.webp b/resource/ship-library/assets/portraits/129.webp new file mode 100644 index 0000000..f9e0c07 Binary files /dev/null and b/resource/ship-library/assets/portraits/129.webp differ diff --git a/resource/ship-library/assets/portraits/1290.webp b/resource/ship-library/assets/portraits/1290.webp new file mode 100644 index 0000000..970fa9d Binary files /dev/null and b/resource/ship-library/assets/portraits/1290.webp differ diff --git a/resource/ship-library/assets/portraits/1291.webp b/resource/ship-library/assets/portraits/1291.webp new file mode 100644 index 0000000..11dea29 Binary files /dev/null and b/resource/ship-library/assets/portraits/1291.webp differ diff --git a/resource/ship-library/assets/portraits/1293.webp b/resource/ship-library/assets/portraits/1293.webp new file mode 100644 index 0000000..b1f26e6 Binary files /dev/null and b/resource/ship-library/assets/portraits/1293.webp differ diff --git a/resource/ship-library/assets/portraits/1299.webp b/resource/ship-library/assets/portraits/1299.webp new file mode 100644 index 0000000..5864737 Binary files /dev/null and b/resource/ship-library/assets/portraits/1299.webp differ diff --git a/resource/ship-library/assets/portraits/13.webp b/resource/ship-library/assets/portraits/13.webp new file mode 100644 index 0000000..387219a Binary files /dev/null and b/resource/ship-library/assets/portraits/13.webp differ diff --git a/resource/ship-library/assets/portraits/130.webp b/resource/ship-library/assets/portraits/130.webp new file mode 100644 index 0000000..4809d98 Binary files /dev/null and b/resource/ship-library/assets/portraits/130.webp differ diff --git a/resource/ship-library/assets/portraits/1301.webp b/resource/ship-library/assets/portraits/1301.webp new file mode 100644 index 0000000..e54ee30 Binary files /dev/null and b/resource/ship-library/assets/portraits/1301.webp differ diff --git a/resource/ship-library/assets/portraits/1306.webp b/resource/ship-library/assets/portraits/1306.webp new file mode 100644 index 0000000..43920a4 Binary files /dev/null and b/resource/ship-library/assets/portraits/1306.webp differ diff --git a/resource/ship-library/assets/portraits/131.webp b/resource/ship-library/assets/portraits/131.webp new file mode 100644 index 0000000..6b0b22c Binary files /dev/null and b/resource/ship-library/assets/portraits/131.webp differ diff --git a/resource/ship-library/assets/portraits/1311.webp b/resource/ship-library/assets/portraits/1311.webp new file mode 100644 index 0000000..8bd8ce3 Binary files /dev/null and b/resource/ship-library/assets/portraits/1311.webp differ diff --git a/resource/ship-library/assets/portraits/1316.webp b/resource/ship-library/assets/portraits/1316.webp new file mode 100644 index 0000000..c4f2457 Binary files /dev/null and b/resource/ship-library/assets/portraits/1316.webp differ diff --git a/resource/ship-library/assets/portraits/132.webp b/resource/ship-library/assets/portraits/132.webp new file mode 100644 index 0000000..a96c4c7 Binary files /dev/null and b/resource/ship-library/assets/portraits/132.webp differ diff --git a/resource/ship-library/assets/portraits/1323.webp b/resource/ship-library/assets/portraits/1323.webp new file mode 100644 index 0000000..53e3b27 Binary files /dev/null and b/resource/ship-library/assets/portraits/1323.webp differ diff --git a/resource/ship-library/assets/portraits/1325.webp b/resource/ship-library/assets/portraits/1325.webp new file mode 100644 index 0000000..eeb67db Binary files /dev/null and b/resource/ship-library/assets/portraits/1325.webp differ diff --git a/resource/ship-library/assets/portraits/133.webp b/resource/ship-library/assets/portraits/133.webp new file mode 100644 index 0000000..84900a2 Binary files /dev/null and b/resource/ship-library/assets/portraits/133.webp differ diff --git a/resource/ship-library/assets/portraits/1332.webp b/resource/ship-library/assets/portraits/1332.webp new file mode 100644 index 0000000..cea1828 Binary files /dev/null and b/resource/ship-library/assets/portraits/1332.webp differ diff --git a/resource/ship-library/assets/portraits/1335.webp b/resource/ship-library/assets/portraits/1335.webp new file mode 100644 index 0000000..b245afe Binary files /dev/null and b/resource/ship-library/assets/portraits/1335.webp differ diff --git a/resource/ship-library/assets/portraits/1339.webp b/resource/ship-library/assets/portraits/1339.webp new file mode 100644 index 0000000..b8bf06e Binary files /dev/null and b/resource/ship-library/assets/portraits/1339.webp differ diff --git a/resource/ship-library/assets/portraits/134.webp b/resource/ship-library/assets/portraits/134.webp new file mode 100644 index 0000000..8db697a Binary files /dev/null and b/resource/ship-library/assets/portraits/134.webp differ diff --git a/resource/ship-library/assets/portraits/1340.webp b/resource/ship-library/assets/portraits/1340.webp new file mode 100644 index 0000000..4084d4f Binary files /dev/null and b/resource/ship-library/assets/portraits/1340.webp differ diff --git a/resource/ship-library/assets/portraits/1342.webp b/resource/ship-library/assets/portraits/1342.webp new file mode 100644 index 0000000..46bd307 Binary files /dev/null and b/resource/ship-library/assets/portraits/1342.webp differ diff --git a/resource/ship-library/assets/portraits/1343.webp b/resource/ship-library/assets/portraits/1343.webp new file mode 100644 index 0000000..1af9e8a Binary files /dev/null and b/resource/ship-library/assets/portraits/1343.webp differ diff --git a/resource/ship-library/assets/portraits/1344.webp b/resource/ship-library/assets/portraits/1344.webp new file mode 100644 index 0000000..036b466 Binary files /dev/null and b/resource/ship-library/assets/portraits/1344.webp differ diff --git a/resource/ship-library/assets/portraits/135.webp b/resource/ship-library/assets/portraits/135.webp new file mode 100644 index 0000000..d347a34 Binary files /dev/null and b/resource/ship-library/assets/portraits/135.webp differ diff --git a/resource/ship-library/assets/portraits/1351.webp b/resource/ship-library/assets/portraits/1351.webp new file mode 100644 index 0000000..24d192f Binary files /dev/null and b/resource/ship-library/assets/portraits/1351.webp differ diff --git a/resource/ship-library/assets/portraits/136.webp b/resource/ship-library/assets/portraits/136.webp new file mode 100644 index 0000000..6760520 Binary files /dev/null and b/resource/ship-library/assets/portraits/136.webp differ diff --git a/resource/ship-library/assets/portraits/1362.webp b/resource/ship-library/assets/portraits/1362.webp new file mode 100644 index 0000000..fd2c556 Binary files /dev/null and b/resource/ship-library/assets/portraits/1362.webp differ diff --git a/resource/ship-library/assets/portraits/1363.webp b/resource/ship-library/assets/portraits/1363.webp new file mode 100644 index 0000000..4e07ccf Binary files /dev/null and b/resource/ship-library/assets/portraits/1363.webp differ diff --git a/resource/ship-library/assets/portraits/1366.webp b/resource/ship-library/assets/portraits/1366.webp new file mode 100644 index 0000000..5ed6b8b Binary files /dev/null and b/resource/ship-library/assets/portraits/1366.webp differ diff --git a/resource/ship-library/assets/portraits/137.webp b/resource/ship-library/assets/portraits/137.webp new file mode 100644 index 0000000..6fe965f Binary files /dev/null and b/resource/ship-library/assets/portraits/137.webp differ diff --git a/resource/ship-library/assets/portraits/1372.webp b/resource/ship-library/assets/portraits/1372.webp new file mode 100644 index 0000000..202028b Binary files /dev/null and b/resource/ship-library/assets/portraits/1372.webp differ diff --git a/resource/ship-library/assets/portraits/138.webp b/resource/ship-library/assets/portraits/138.webp new file mode 100644 index 0000000..6ae4c98 Binary files /dev/null and b/resource/ship-library/assets/portraits/138.webp differ diff --git a/resource/ship-library/assets/portraits/1380.webp b/resource/ship-library/assets/portraits/1380.webp new file mode 100644 index 0000000..6aa8c13 Binary files /dev/null and b/resource/ship-library/assets/portraits/1380.webp differ diff --git a/resource/ship-library/assets/portraits/139.webp b/resource/ship-library/assets/portraits/139.webp new file mode 100644 index 0000000..d7ec958 Binary files /dev/null and b/resource/ship-library/assets/portraits/139.webp differ diff --git a/resource/ship-library/assets/portraits/14.webp b/resource/ship-library/assets/portraits/14.webp new file mode 100644 index 0000000..584c6c5 Binary files /dev/null and b/resource/ship-library/assets/portraits/14.webp differ diff --git a/resource/ship-library/assets/portraits/140.webp b/resource/ship-library/assets/portraits/140.webp new file mode 100644 index 0000000..c5ecd20 Binary files /dev/null and b/resource/ship-library/assets/portraits/140.webp differ diff --git a/resource/ship-library/assets/portraits/1400.webp b/resource/ship-library/assets/portraits/1400.webp new file mode 100644 index 0000000..3b4f915 Binary files /dev/null and b/resource/ship-library/assets/portraits/1400.webp differ diff --git a/resource/ship-library/assets/portraits/1408.webp b/resource/ship-library/assets/portraits/1408.webp new file mode 100644 index 0000000..ff27871 Binary files /dev/null and b/resource/ship-library/assets/portraits/1408.webp differ diff --git a/resource/ship-library/assets/portraits/141.webp b/resource/ship-library/assets/portraits/141.webp new file mode 100644 index 0000000..1f71302 Binary files /dev/null and b/resource/ship-library/assets/portraits/141.webp differ diff --git a/resource/ship-library/assets/portraits/1413.webp b/resource/ship-library/assets/portraits/1413.webp new file mode 100644 index 0000000..0765e94 Binary files /dev/null and b/resource/ship-library/assets/portraits/1413.webp differ diff --git a/resource/ship-library/assets/portraits/1414.webp b/resource/ship-library/assets/portraits/1414.webp new file mode 100644 index 0000000..507687b Binary files /dev/null and b/resource/ship-library/assets/portraits/1414.webp differ diff --git a/resource/ship-library/assets/portraits/1416.webp b/resource/ship-library/assets/portraits/1416.webp new file mode 100644 index 0000000..2d0db1a Binary files /dev/null and b/resource/ship-library/assets/portraits/1416.webp differ diff --git a/resource/ship-library/assets/portraits/142.webp b/resource/ship-library/assets/portraits/142.webp new file mode 100644 index 0000000..695b285 Binary files /dev/null and b/resource/ship-library/assets/portraits/142.webp differ diff --git a/resource/ship-library/assets/portraits/1425.webp b/resource/ship-library/assets/portraits/1425.webp new file mode 100644 index 0000000..7f3fa34 Binary files /dev/null and b/resource/ship-library/assets/portraits/1425.webp differ diff --git a/resource/ship-library/assets/portraits/1426.webp b/resource/ship-library/assets/portraits/1426.webp new file mode 100644 index 0000000..183c3a5 Binary files /dev/null and b/resource/ship-library/assets/portraits/1426.webp differ diff --git a/resource/ship-library/assets/portraits/1429.webp b/resource/ship-library/assets/portraits/1429.webp new file mode 100644 index 0000000..5f023eb Binary files /dev/null and b/resource/ship-library/assets/portraits/1429.webp differ diff --git a/resource/ship-library/assets/portraits/143.webp b/resource/ship-library/assets/portraits/143.webp new file mode 100644 index 0000000..72e2c72 Binary files /dev/null and b/resource/ship-library/assets/portraits/143.webp differ diff --git a/resource/ship-library/assets/portraits/1430.webp b/resource/ship-library/assets/portraits/1430.webp new file mode 100644 index 0000000..f00cb51 Binary files /dev/null and b/resource/ship-library/assets/portraits/1430.webp differ diff --git a/resource/ship-library/assets/portraits/1431.webp b/resource/ship-library/assets/portraits/1431.webp new file mode 100644 index 0000000..e847540 Binary files /dev/null and b/resource/ship-library/assets/portraits/1431.webp differ diff --git a/resource/ship-library/assets/portraits/144.webp b/resource/ship-library/assets/portraits/144.webp new file mode 100644 index 0000000..bd3921f Binary files /dev/null and b/resource/ship-library/assets/portraits/144.webp differ diff --git a/resource/ship-library/assets/portraits/145.webp b/resource/ship-library/assets/portraits/145.webp new file mode 100644 index 0000000..711b8f8 Binary files /dev/null and b/resource/ship-library/assets/portraits/145.webp differ diff --git a/resource/ship-library/assets/portraits/1456.webp b/resource/ship-library/assets/portraits/1456.webp new file mode 100644 index 0000000..506a1ef Binary files /dev/null and b/resource/ship-library/assets/portraits/1456.webp differ diff --git a/resource/ship-library/assets/portraits/146.webp b/resource/ship-library/assets/portraits/146.webp new file mode 100644 index 0000000..1be3deb Binary files /dev/null and b/resource/ship-library/assets/portraits/146.webp differ diff --git a/resource/ship-library/assets/portraits/1467.webp b/resource/ship-library/assets/portraits/1467.webp new file mode 100644 index 0000000..672bf65 Binary files /dev/null and b/resource/ship-library/assets/portraits/1467.webp differ diff --git a/resource/ship-library/assets/portraits/147.webp b/resource/ship-library/assets/portraits/147.webp new file mode 100644 index 0000000..3058fe3 Binary files /dev/null and b/resource/ship-library/assets/portraits/147.webp differ diff --git a/resource/ship-library/assets/portraits/148.webp b/resource/ship-library/assets/portraits/148.webp new file mode 100644 index 0000000..f39191b Binary files /dev/null and b/resource/ship-library/assets/portraits/148.webp differ diff --git a/resource/ship-library/assets/portraits/1483.webp b/resource/ship-library/assets/portraits/1483.webp new file mode 100644 index 0000000..21630d3 Binary files /dev/null and b/resource/ship-library/assets/portraits/1483.webp differ diff --git a/resource/ship-library/assets/portraits/149.webp b/resource/ship-library/assets/portraits/149.webp new file mode 100644 index 0000000..3d18d95 Binary files /dev/null and b/resource/ship-library/assets/portraits/149.webp differ diff --git a/resource/ship-library/assets/portraits/1490.webp b/resource/ship-library/assets/portraits/1490.webp new file mode 100644 index 0000000..b9164c7 Binary files /dev/null and b/resource/ship-library/assets/portraits/1490.webp differ diff --git a/resource/ship-library/assets/portraits/1496.webp b/resource/ship-library/assets/portraits/1496.webp new file mode 100644 index 0000000..14bb818 Binary files /dev/null and b/resource/ship-library/assets/portraits/1496.webp differ diff --git a/resource/ship-library/assets/portraits/15.webp b/resource/ship-library/assets/portraits/15.webp new file mode 100644 index 0000000..e3560da Binary files /dev/null and b/resource/ship-library/assets/portraits/15.webp differ diff --git a/resource/ship-library/assets/portraits/150.webp b/resource/ship-library/assets/portraits/150.webp new file mode 100644 index 0000000..271e61a Binary files /dev/null and b/resource/ship-library/assets/portraits/150.webp differ diff --git a/resource/ship-library/assets/portraits/1503.webp b/resource/ship-library/assets/portraits/1503.webp new file mode 100644 index 0000000..ba81f55 Binary files /dev/null and b/resource/ship-library/assets/portraits/1503.webp differ diff --git a/resource/ship-library/assets/portraits/1509.webp b/resource/ship-library/assets/portraits/1509.webp new file mode 100644 index 0000000..c22cc4e Binary files /dev/null and b/resource/ship-library/assets/portraits/1509.webp differ diff --git a/resource/ship-library/assets/portraits/151.webp b/resource/ship-library/assets/portraits/151.webp new file mode 100644 index 0000000..c33690d Binary files /dev/null and b/resource/ship-library/assets/portraits/151.webp differ diff --git a/resource/ship-library/assets/portraits/1516.webp b/resource/ship-library/assets/portraits/1516.webp new file mode 100644 index 0000000..e136e59 Binary files /dev/null and b/resource/ship-library/assets/portraits/1516.webp differ diff --git a/resource/ship-library/assets/portraits/1517.webp b/resource/ship-library/assets/portraits/1517.webp new file mode 100644 index 0000000..339387b Binary files /dev/null and b/resource/ship-library/assets/portraits/1517.webp differ diff --git a/resource/ship-library/assets/portraits/1519.webp b/resource/ship-library/assets/portraits/1519.webp new file mode 100644 index 0000000..f95f4ae Binary files /dev/null and b/resource/ship-library/assets/portraits/1519.webp differ diff --git a/resource/ship-library/assets/portraits/152.webp b/resource/ship-library/assets/portraits/152.webp new file mode 100644 index 0000000..95c33c0 Binary files /dev/null and b/resource/ship-library/assets/portraits/152.webp differ diff --git a/resource/ship-library/assets/portraits/1527.webp b/resource/ship-library/assets/portraits/1527.webp new file mode 100644 index 0000000..1d97189 Binary files /dev/null and b/resource/ship-library/assets/portraits/1527.webp differ diff --git a/resource/ship-library/assets/portraits/1528.webp b/resource/ship-library/assets/portraits/1528.webp new file mode 100644 index 0000000..825b4bd Binary files /dev/null and b/resource/ship-library/assets/portraits/1528.webp differ diff --git a/resource/ship-library/assets/portraits/153.webp b/resource/ship-library/assets/portraits/153.webp new file mode 100644 index 0000000..4dff0fe Binary files /dev/null and b/resource/ship-library/assets/portraits/153.webp differ diff --git a/resource/ship-library/assets/portraits/1530.webp b/resource/ship-library/assets/portraits/1530.webp new file mode 100644 index 0000000..dab6c78 Binary files /dev/null and b/resource/ship-library/assets/portraits/1530.webp differ diff --git a/resource/ship-library/assets/portraits/1532.webp b/resource/ship-library/assets/portraits/1532.webp new file mode 100644 index 0000000..eac88af Binary files /dev/null and b/resource/ship-library/assets/portraits/1532.webp differ diff --git a/resource/ship-library/assets/portraits/1538.webp b/resource/ship-library/assets/portraits/1538.webp new file mode 100644 index 0000000..cd95a29 Binary files /dev/null and b/resource/ship-library/assets/portraits/1538.webp differ diff --git a/resource/ship-library/assets/portraits/154.webp b/resource/ship-library/assets/portraits/154.webp new file mode 100644 index 0000000..e1d8c94 Binary files /dev/null and b/resource/ship-library/assets/portraits/154.webp differ diff --git a/resource/ship-library/assets/portraits/1545.webp b/resource/ship-library/assets/portraits/1545.webp new file mode 100644 index 0000000..8c5d41c Binary files /dev/null and b/resource/ship-library/assets/portraits/1545.webp differ diff --git a/resource/ship-library/assets/portraits/155.webp b/resource/ship-library/assets/portraits/155.webp new file mode 100644 index 0000000..e846f09 Binary files /dev/null and b/resource/ship-library/assets/portraits/155.webp differ diff --git a/resource/ship-library/assets/portraits/156.webp b/resource/ship-library/assets/portraits/156.webp new file mode 100644 index 0000000..f98f646 Binary files /dev/null and b/resource/ship-library/assets/portraits/156.webp differ diff --git a/resource/ship-library/assets/portraits/1560.webp b/resource/ship-library/assets/portraits/1560.webp new file mode 100644 index 0000000..7538d6d Binary files /dev/null and b/resource/ship-library/assets/portraits/1560.webp differ diff --git a/resource/ship-library/assets/portraits/157.webp b/resource/ship-library/assets/portraits/157.webp new file mode 100644 index 0000000..3aa837b Binary files /dev/null and b/resource/ship-library/assets/portraits/157.webp differ diff --git a/resource/ship-library/assets/portraits/1575.webp b/resource/ship-library/assets/portraits/1575.webp new file mode 100644 index 0000000..b3019a1 Binary files /dev/null and b/resource/ship-library/assets/portraits/1575.webp differ diff --git a/resource/ship-library/assets/portraits/158.webp b/resource/ship-library/assets/portraits/158.webp new file mode 100644 index 0000000..c2faa73 Binary files /dev/null and b/resource/ship-library/assets/portraits/158.webp differ diff --git a/resource/ship-library/assets/portraits/1583.webp b/resource/ship-library/assets/portraits/1583.webp new file mode 100644 index 0000000..d64177c Binary files /dev/null and b/resource/ship-library/assets/portraits/1583.webp differ diff --git a/resource/ship-library/assets/portraits/1589.webp b/resource/ship-library/assets/portraits/1589.webp new file mode 100644 index 0000000..84c1115 Binary files /dev/null and b/resource/ship-library/assets/portraits/1589.webp differ diff --git a/resource/ship-library/assets/portraits/159.webp b/resource/ship-library/assets/portraits/159.webp new file mode 100644 index 0000000..b712ff3 Binary files /dev/null and b/resource/ship-library/assets/portraits/159.webp differ diff --git a/resource/ship-library/assets/portraits/1590.webp b/resource/ship-library/assets/portraits/1590.webp new file mode 100644 index 0000000..865bbf0 Binary files /dev/null and b/resource/ship-library/assets/portraits/1590.webp differ diff --git a/resource/ship-library/assets/portraits/16.webp b/resource/ship-library/assets/portraits/16.webp new file mode 100644 index 0000000..775c04f Binary files /dev/null and b/resource/ship-library/assets/portraits/16.webp differ diff --git a/resource/ship-library/assets/portraits/160.webp b/resource/ship-library/assets/portraits/160.webp new file mode 100644 index 0000000..0ca2e5c Binary files /dev/null and b/resource/ship-library/assets/portraits/160.webp differ diff --git a/resource/ship-library/assets/portraits/1606.webp b/resource/ship-library/assets/portraits/1606.webp new file mode 100644 index 0000000..caea75f Binary files /dev/null and b/resource/ship-library/assets/portraits/1606.webp differ diff --git a/resource/ship-library/assets/portraits/161.webp b/resource/ship-library/assets/portraits/161.webp new file mode 100644 index 0000000..9861832 Binary files /dev/null and b/resource/ship-library/assets/portraits/161.webp differ diff --git a/resource/ship-library/assets/portraits/1618.webp b/resource/ship-library/assets/portraits/1618.webp new file mode 100644 index 0000000..3e5e6b5 Binary files /dev/null and b/resource/ship-library/assets/portraits/1618.webp differ diff --git a/resource/ship-library/assets/portraits/162.webp b/resource/ship-library/assets/portraits/162.webp new file mode 100644 index 0000000..8a06eae Binary files /dev/null and b/resource/ship-library/assets/portraits/162.webp differ diff --git a/resource/ship-library/assets/portraits/163.webp b/resource/ship-library/assets/portraits/163.webp new file mode 100644 index 0000000..0e60ee4 Binary files /dev/null and b/resource/ship-library/assets/portraits/163.webp differ diff --git a/resource/ship-library/assets/portraits/164.webp b/resource/ship-library/assets/portraits/164.webp new file mode 100644 index 0000000..3186fb7 Binary files /dev/null and b/resource/ship-library/assets/portraits/164.webp differ diff --git a/resource/ship-library/assets/portraits/165.webp b/resource/ship-library/assets/portraits/165.webp new file mode 100644 index 0000000..c8b38f7 Binary files /dev/null and b/resource/ship-library/assets/portraits/165.webp differ diff --git a/resource/ship-library/assets/portraits/166.webp b/resource/ship-library/assets/portraits/166.webp new file mode 100644 index 0000000..a5f74e2 Binary files /dev/null and b/resource/ship-library/assets/portraits/166.webp differ diff --git a/resource/ship-library/assets/portraits/167.webp b/resource/ship-library/assets/portraits/167.webp new file mode 100644 index 0000000..c40802c Binary files /dev/null and b/resource/ship-library/assets/portraits/167.webp differ diff --git a/resource/ship-library/assets/portraits/168.webp b/resource/ship-library/assets/portraits/168.webp new file mode 100644 index 0000000..99d099d Binary files /dev/null and b/resource/ship-library/assets/portraits/168.webp differ diff --git a/resource/ship-library/assets/portraits/169.webp b/resource/ship-library/assets/portraits/169.webp new file mode 100644 index 0000000..fe62d7f Binary files /dev/null and b/resource/ship-library/assets/portraits/169.webp differ diff --git a/resource/ship-library/assets/portraits/17.webp b/resource/ship-library/assets/portraits/17.webp new file mode 100644 index 0000000..072654b Binary files /dev/null and b/resource/ship-library/assets/portraits/17.webp differ diff --git a/resource/ship-library/assets/portraits/170.webp b/resource/ship-library/assets/portraits/170.webp new file mode 100644 index 0000000..fc9abd2 Binary files /dev/null and b/resource/ship-library/assets/portraits/170.webp differ diff --git a/resource/ship-library/assets/portraits/171.webp b/resource/ship-library/assets/portraits/171.webp new file mode 100644 index 0000000..5f7033c Binary files /dev/null and b/resource/ship-library/assets/portraits/171.webp differ diff --git a/resource/ship-library/assets/portraits/172.webp b/resource/ship-library/assets/portraits/172.webp new file mode 100644 index 0000000..178fe41 Binary files /dev/null and b/resource/ship-library/assets/portraits/172.webp differ diff --git a/resource/ship-library/assets/portraits/173.webp b/resource/ship-library/assets/portraits/173.webp new file mode 100644 index 0000000..0a48ac9 Binary files /dev/null and b/resource/ship-library/assets/portraits/173.webp differ diff --git a/resource/ship-library/assets/portraits/174.webp b/resource/ship-library/assets/portraits/174.webp new file mode 100644 index 0000000..6caf1ba Binary files /dev/null and b/resource/ship-library/assets/portraits/174.webp differ diff --git a/resource/ship-library/assets/portraits/175.webp b/resource/ship-library/assets/portraits/175.webp new file mode 100644 index 0000000..b20ab16 Binary files /dev/null and b/resource/ship-library/assets/portraits/175.webp differ diff --git a/resource/ship-library/assets/portraits/176.webp b/resource/ship-library/assets/portraits/176.webp new file mode 100644 index 0000000..551bec0 Binary files /dev/null and b/resource/ship-library/assets/portraits/176.webp differ diff --git a/resource/ship-library/assets/portraits/177.webp b/resource/ship-library/assets/portraits/177.webp new file mode 100644 index 0000000..ef746e9 Binary files /dev/null and b/resource/ship-library/assets/portraits/177.webp differ diff --git a/resource/ship-library/assets/portraits/178.webp b/resource/ship-library/assets/portraits/178.webp new file mode 100644 index 0000000..20d0243 Binary files /dev/null and b/resource/ship-library/assets/portraits/178.webp differ diff --git a/resource/ship-library/assets/portraits/179.webp b/resource/ship-library/assets/portraits/179.webp new file mode 100644 index 0000000..8be9d7c Binary files /dev/null and b/resource/ship-library/assets/portraits/179.webp differ diff --git a/resource/ship-library/assets/portraits/18.webp b/resource/ship-library/assets/portraits/18.webp new file mode 100644 index 0000000..3981629 Binary files /dev/null and b/resource/ship-library/assets/portraits/18.webp differ diff --git a/resource/ship-library/assets/portraits/180.webp b/resource/ship-library/assets/portraits/180.webp new file mode 100644 index 0000000..68a2b10 Binary files /dev/null and b/resource/ship-library/assets/portraits/180.webp differ diff --git a/resource/ship-library/assets/portraits/181.webp b/resource/ship-library/assets/portraits/181.webp new file mode 100644 index 0000000..508c116 Binary files /dev/null and b/resource/ship-library/assets/portraits/181.webp differ diff --git a/resource/ship-library/assets/portraits/182.webp b/resource/ship-library/assets/portraits/182.webp new file mode 100644 index 0000000..a4ca25a Binary files /dev/null and b/resource/ship-library/assets/portraits/182.webp differ diff --git a/resource/ship-library/assets/portraits/183.webp b/resource/ship-library/assets/portraits/183.webp new file mode 100644 index 0000000..943ae15 Binary files /dev/null and b/resource/ship-library/assets/portraits/183.webp differ diff --git a/resource/ship-library/assets/portraits/184.webp b/resource/ship-library/assets/portraits/184.webp new file mode 100644 index 0000000..53037ff Binary files /dev/null and b/resource/ship-library/assets/portraits/184.webp differ diff --git a/resource/ship-library/assets/portraits/185.webp b/resource/ship-library/assets/portraits/185.webp new file mode 100644 index 0000000..7dbccd5 Binary files /dev/null and b/resource/ship-library/assets/portraits/185.webp differ diff --git a/resource/ship-library/assets/portraits/186.webp b/resource/ship-library/assets/portraits/186.webp new file mode 100644 index 0000000..fd9708e Binary files /dev/null and b/resource/ship-library/assets/portraits/186.webp differ diff --git a/resource/ship-library/assets/portraits/187.webp b/resource/ship-library/assets/portraits/187.webp new file mode 100644 index 0000000..214476a Binary files /dev/null and b/resource/ship-library/assets/portraits/187.webp differ diff --git a/resource/ship-library/assets/portraits/188.webp b/resource/ship-library/assets/portraits/188.webp new file mode 100644 index 0000000..99d1b1a Binary files /dev/null and b/resource/ship-library/assets/portraits/188.webp differ diff --git a/resource/ship-library/assets/portraits/189.webp b/resource/ship-library/assets/portraits/189.webp new file mode 100644 index 0000000..75a36b4 Binary files /dev/null and b/resource/ship-library/assets/portraits/189.webp differ diff --git a/resource/ship-library/assets/portraits/19.webp b/resource/ship-library/assets/portraits/19.webp new file mode 100644 index 0000000..a2de2c3 Binary files /dev/null and b/resource/ship-library/assets/portraits/19.webp differ diff --git a/resource/ship-library/assets/portraits/190.webp b/resource/ship-library/assets/portraits/190.webp new file mode 100644 index 0000000..ffc1051 Binary files /dev/null and b/resource/ship-library/assets/portraits/190.webp differ diff --git a/resource/ship-library/assets/portraits/191.webp b/resource/ship-library/assets/portraits/191.webp new file mode 100644 index 0000000..db82719 Binary files /dev/null and b/resource/ship-library/assets/portraits/191.webp differ diff --git a/resource/ship-library/assets/portraits/192.webp b/resource/ship-library/assets/portraits/192.webp new file mode 100644 index 0000000..6a47eea Binary files /dev/null and b/resource/ship-library/assets/portraits/192.webp differ diff --git a/resource/ship-library/assets/portraits/193.webp b/resource/ship-library/assets/portraits/193.webp new file mode 100644 index 0000000..086f569 Binary files /dev/null and b/resource/ship-library/assets/portraits/193.webp differ diff --git a/resource/ship-library/assets/portraits/194.webp b/resource/ship-library/assets/portraits/194.webp new file mode 100644 index 0000000..79868c5 Binary files /dev/null and b/resource/ship-library/assets/portraits/194.webp differ diff --git a/resource/ship-library/assets/portraits/195.webp b/resource/ship-library/assets/portraits/195.webp new file mode 100644 index 0000000..f9f1f3c Binary files /dev/null and b/resource/ship-library/assets/portraits/195.webp differ diff --git a/resource/ship-library/assets/portraits/196.webp b/resource/ship-library/assets/portraits/196.webp new file mode 100644 index 0000000..a22d9c0 Binary files /dev/null and b/resource/ship-library/assets/portraits/196.webp differ diff --git a/resource/ship-library/assets/portraits/197.webp b/resource/ship-library/assets/portraits/197.webp new file mode 100644 index 0000000..5babcfe Binary files /dev/null and b/resource/ship-library/assets/portraits/197.webp differ diff --git a/resource/ship-library/assets/portraits/198.webp b/resource/ship-library/assets/portraits/198.webp new file mode 100644 index 0000000..67cdd95 Binary files /dev/null and b/resource/ship-library/assets/portraits/198.webp differ diff --git a/resource/ship-library/assets/portraits/199.webp b/resource/ship-library/assets/portraits/199.webp new file mode 100644 index 0000000..65dfd7a Binary files /dev/null and b/resource/ship-library/assets/portraits/199.webp differ diff --git a/resource/ship-library/assets/portraits/2.webp b/resource/ship-library/assets/portraits/2.webp new file mode 100644 index 0000000..e145976 Binary files /dev/null and b/resource/ship-library/assets/portraits/2.webp differ diff --git a/resource/ship-library/assets/portraits/20.webp b/resource/ship-library/assets/portraits/20.webp new file mode 100644 index 0000000..729ad0c Binary files /dev/null and b/resource/ship-library/assets/portraits/20.webp differ diff --git a/resource/ship-library/assets/portraits/200.webp b/resource/ship-library/assets/portraits/200.webp new file mode 100644 index 0000000..b463d9c Binary files /dev/null and b/resource/ship-library/assets/portraits/200.webp differ diff --git a/resource/ship-library/assets/portraits/201.webp b/resource/ship-library/assets/portraits/201.webp new file mode 100644 index 0000000..ca7fb53 Binary files /dev/null and b/resource/ship-library/assets/portraits/201.webp differ diff --git a/resource/ship-library/assets/portraits/202.webp b/resource/ship-library/assets/portraits/202.webp new file mode 100644 index 0000000..4e6e9f7 Binary files /dev/null and b/resource/ship-library/assets/portraits/202.webp differ diff --git a/resource/ship-library/assets/portraits/203.webp b/resource/ship-library/assets/portraits/203.webp new file mode 100644 index 0000000..7b644a6 Binary files /dev/null and b/resource/ship-library/assets/portraits/203.webp differ diff --git a/resource/ship-library/assets/portraits/205.webp b/resource/ship-library/assets/portraits/205.webp new file mode 100644 index 0000000..677cadc Binary files /dev/null and b/resource/ship-library/assets/portraits/205.webp differ diff --git a/resource/ship-library/assets/portraits/206.webp b/resource/ship-library/assets/portraits/206.webp new file mode 100644 index 0000000..6fc3829 Binary files /dev/null and b/resource/ship-library/assets/portraits/206.webp differ diff --git a/resource/ship-library/assets/portraits/207.webp b/resource/ship-library/assets/portraits/207.webp new file mode 100644 index 0000000..caec2d9 Binary files /dev/null and b/resource/ship-library/assets/portraits/207.webp differ diff --git a/resource/ship-library/assets/portraits/208.webp b/resource/ship-library/assets/portraits/208.webp new file mode 100644 index 0000000..dead11c Binary files /dev/null and b/resource/ship-library/assets/portraits/208.webp differ diff --git a/resource/ship-library/assets/portraits/209.webp b/resource/ship-library/assets/portraits/209.webp new file mode 100644 index 0000000..3879229 Binary files /dev/null and b/resource/ship-library/assets/portraits/209.webp differ diff --git a/resource/ship-library/assets/portraits/21.webp b/resource/ship-library/assets/portraits/21.webp new file mode 100644 index 0000000..39c4d32 Binary files /dev/null and b/resource/ship-library/assets/portraits/21.webp differ diff --git a/resource/ship-library/assets/portraits/210.webp b/resource/ship-library/assets/portraits/210.webp new file mode 100644 index 0000000..f83f429 Binary files /dev/null and b/resource/ship-library/assets/portraits/210.webp differ diff --git a/resource/ship-library/assets/portraits/211.webp b/resource/ship-library/assets/portraits/211.webp new file mode 100644 index 0000000..2f1f9df Binary files /dev/null and b/resource/ship-library/assets/portraits/211.webp differ diff --git a/resource/ship-library/assets/portraits/212.webp b/resource/ship-library/assets/portraits/212.webp new file mode 100644 index 0000000..0a23511 Binary files /dev/null and b/resource/ship-library/assets/portraits/212.webp differ diff --git a/resource/ship-library/assets/portraits/213.webp b/resource/ship-library/assets/portraits/213.webp new file mode 100644 index 0000000..e18781c Binary files /dev/null and b/resource/ship-library/assets/portraits/213.webp differ diff --git a/resource/ship-library/assets/portraits/214.webp b/resource/ship-library/assets/portraits/214.webp new file mode 100644 index 0000000..4d17cff Binary files /dev/null and b/resource/ship-library/assets/portraits/214.webp differ diff --git a/resource/ship-library/assets/portraits/215.webp b/resource/ship-library/assets/portraits/215.webp new file mode 100644 index 0000000..c283d3f Binary files /dev/null and b/resource/ship-library/assets/portraits/215.webp differ diff --git a/resource/ship-library/assets/portraits/216.webp b/resource/ship-library/assets/portraits/216.webp new file mode 100644 index 0000000..271cf9f Binary files /dev/null and b/resource/ship-library/assets/portraits/216.webp differ diff --git a/resource/ship-library/assets/portraits/217.webp b/resource/ship-library/assets/portraits/217.webp new file mode 100644 index 0000000..fea93f1 Binary files /dev/null and b/resource/ship-library/assets/portraits/217.webp differ diff --git a/resource/ship-library/assets/portraits/218.webp b/resource/ship-library/assets/portraits/218.webp new file mode 100644 index 0000000..ba31426 Binary files /dev/null and b/resource/ship-library/assets/portraits/218.webp differ diff --git a/resource/ship-library/assets/portraits/219.webp b/resource/ship-library/assets/portraits/219.webp new file mode 100644 index 0000000..70b3d20 Binary files /dev/null and b/resource/ship-library/assets/portraits/219.webp differ diff --git a/resource/ship-library/assets/portraits/22.webp b/resource/ship-library/assets/portraits/22.webp new file mode 100644 index 0000000..e6648d6 Binary files /dev/null and b/resource/ship-library/assets/portraits/22.webp differ diff --git a/resource/ship-library/assets/portraits/220.webp b/resource/ship-library/assets/portraits/220.webp new file mode 100644 index 0000000..0b3654f Binary files /dev/null and b/resource/ship-library/assets/portraits/220.webp differ diff --git a/resource/ship-library/assets/portraits/221.webp b/resource/ship-library/assets/portraits/221.webp new file mode 100644 index 0000000..9d91579 Binary files /dev/null and b/resource/ship-library/assets/portraits/221.webp differ diff --git a/resource/ship-library/assets/portraits/222.webp b/resource/ship-library/assets/portraits/222.webp new file mode 100644 index 0000000..33576d3 Binary files /dev/null and b/resource/ship-library/assets/portraits/222.webp differ diff --git a/resource/ship-library/assets/portraits/223.webp b/resource/ship-library/assets/portraits/223.webp new file mode 100644 index 0000000..08eb706 Binary files /dev/null and b/resource/ship-library/assets/portraits/223.webp differ diff --git a/resource/ship-library/assets/portraits/224.webp b/resource/ship-library/assets/portraits/224.webp new file mode 100644 index 0000000..942eae5 Binary files /dev/null and b/resource/ship-library/assets/portraits/224.webp differ diff --git a/resource/ship-library/assets/portraits/225.webp b/resource/ship-library/assets/portraits/225.webp new file mode 100644 index 0000000..24f532a Binary files /dev/null and b/resource/ship-library/assets/portraits/225.webp differ diff --git a/resource/ship-library/assets/portraits/226.webp b/resource/ship-library/assets/portraits/226.webp new file mode 100644 index 0000000..ee3958c Binary files /dev/null and b/resource/ship-library/assets/portraits/226.webp differ diff --git a/resource/ship-library/assets/portraits/227.webp b/resource/ship-library/assets/portraits/227.webp new file mode 100644 index 0000000..b1e90f5 Binary files /dev/null and b/resource/ship-library/assets/portraits/227.webp differ diff --git a/resource/ship-library/assets/portraits/228.webp b/resource/ship-library/assets/portraits/228.webp new file mode 100644 index 0000000..5af15be Binary files /dev/null and b/resource/ship-library/assets/portraits/228.webp differ diff --git a/resource/ship-library/assets/portraits/229.webp b/resource/ship-library/assets/portraits/229.webp new file mode 100644 index 0000000..1519af4 Binary files /dev/null and b/resource/ship-library/assets/portraits/229.webp differ diff --git a/resource/ship-library/assets/portraits/23.webp b/resource/ship-library/assets/portraits/23.webp new file mode 100644 index 0000000..26f767d Binary files /dev/null and b/resource/ship-library/assets/portraits/23.webp differ diff --git a/resource/ship-library/assets/portraits/230.webp b/resource/ship-library/assets/portraits/230.webp new file mode 100644 index 0000000..fa30bba Binary files /dev/null and b/resource/ship-library/assets/portraits/230.webp differ diff --git a/resource/ship-library/assets/portraits/231.webp b/resource/ship-library/assets/portraits/231.webp new file mode 100644 index 0000000..d4967e8 Binary files /dev/null and b/resource/ship-library/assets/portraits/231.webp differ diff --git a/resource/ship-library/assets/portraits/232.webp b/resource/ship-library/assets/portraits/232.webp new file mode 100644 index 0000000..c412421 Binary files /dev/null and b/resource/ship-library/assets/portraits/232.webp differ diff --git a/resource/ship-library/assets/portraits/233.webp b/resource/ship-library/assets/portraits/233.webp new file mode 100644 index 0000000..8029a0f Binary files /dev/null and b/resource/ship-library/assets/portraits/233.webp differ diff --git a/resource/ship-library/assets/portraits/234.webp b/resource/ship-library/assets/portraits/234.webp new file mode 100644 index 0000000..15eabc4 Binary files /dev/null and b/resource/ship-library/assets/portraits/234.webp differ diff --git a/resource/ship-library/assets/portraits/235.webp b/resource/ship-library/assets/portraits/235.webp new file mode 100644 index 0000000..0339f1d Binary files /dev/null and b/resource/ship-library/assets/portraits/235.webp differ diff --git a/resource/ship-library/assets/portraits/236.webp b/resource/ship-library/assets/portraits/236.webp new file mode 100644 index 0000000..b6ebec0 Binary files /dev/null and b/resource/ship-library/assets/portraits/236.webp differ diff --git a/resource/ship-library/assets/portraits/237.webp b/resource/ship-library/assets/portraits/237.webp new file mode 100644 index 0000000..c592ebc Binary files /dev/null and b/resource/ship-library/assets/portraits/237.webp differ diff --git a/resource/ship-library/assets/portraits/238.webp b/resource/ship-library/assets/portraits/238.webp new file mode 100644 index 0000000..d5fcd20 Binary files /dev/null and b/resource/ship-library/assets/portraits/238.webp differ diff --git a/resource/ship-library/assets/portraits/239.webp b/resource/ship-library/assets/portraits/239.webp new file mode 100644 index 0000000..c973bbf Binary files /dev/null and b/resource/ship-library/assets/portraits/239.webp differ diff --git a/resource/ship-library/assets/portraits/24.webp b/resource/ship-library/assets/portraits/24.webp new file mode 100644 index 0000000..ddf49df Binary files /dev/null and b/resource/ship-library/assets/portraits/24.webp differ diff --git a/resource/ship-library/assets/portraits/240.webp b/resource/ship-library/assets/portraits/240.webp new file mode 100644 index 0000000..47ce90e Binary files /dev/null and b/resource/ship-library/assets/portraits/240.webp differ diff --git a/resource/ship-library/assets/portraits/241.webp b/resource/ship-library/assets/portraits/241.webp new file mode 100644 index 0000000..9bbe28c Binary files /dev/null and b/resource/ship-library/assets/portraits/241.webp differ diff --git a/resource/ship-library/assets/portraits/242.webp b/resource/ship-library/assets/portraits/242.webp new file mode 100644 index 0000000..e8cff44 Binary files /dev/null and b/resource/ship-library/assets/portraits/242.webp differ diff --git a/resource/ship-library/assets/portraits/243.webp b/resource/ship-library/assets/portraits/243.webp new file mode 100644 index 0000000..41387bb Binary files /dev/null and b/resource/ship-library/assets/portraits/243.webp differ diff --git a/resource/ship-library/assets/portraits/244.webp b/resource/ship-library/assets/portraits/244.webp new file mode 100644 index 0000000..5746488 Binary files /dev/null and b/resource/ship-library/assets/portraits/244.webp differ diff --git a/resource/ship-library/assets/portraits/245.webp b/resource/ship-library/assets/portraits/245.webp new file mode 100644 index 0000000..935b043 Binary files /dev/null and b/resource/ship-library/assets/portraits/245.webp differ diff --git a/resource/ship-library/assets/portraits/246.webp b/resource/ship-library/assets/portraits/246.webp new file mode 100644 index 0000000..be95435 Binary files /dev/null and b/resource/ship-library/assets/portraits/246.webp differ diff --git a/resource/ship-library/assets/portraits/247.webp b/resource/ship-library/assets/portraits/247.webp new file mode 100644 index 0000000..0f7cfa6 Binary files /dev/null and b/resource/ship-library/assets/portraits/247.webp differ diff --git a/resource/ship-library/assets/portraits/248.webp b/resource/ship-library/assets/portraits/248.webp new file mode 100644 index 0000000..a55cb52 Binary files /dev/null and b/resource/ship-library/assets/portraits/248.webp differ diff --git a/resource/ship-library/assets/portraits/249.webp b/resource/ship-library/assets/portraits/249.webp new file mode 100644 index 0000000..fa597de Binary files /dev/null and b/resource/ship-library/assets/portraits/249.webp differ diff --git a/resource/ship-library/assets/portraits/25.webp b/resource/ship-library/assets/portraits/25.webp new file mode 100644 index 0000000..5450406 Binary files /dev/null and b/resource/ship-library/assets/portraits/25.webp differ diff --git a/resource/ship-library/assets/portraits/250.webp b/resource/ship-library/assets/portraits/250.webp new file mode 100644 index 0000000..584a16f Binary files /dev/null and b/resource/ship-library/assets/portraits/250.webp differ diff --git a/resource/ship-library/assets/portraits/251.webp b/resource/ship-library/assets/portraits/251.webp new file mode 100644 index 0000000..2c2bacb Binary files /dev/null and b/resource/ship-library/assets/portraits/251.webp differ diff --git a/resource/ship-library/assets/portraits/252.webp b/resource/ship-library/assets/portraits/252.webp new file mode 100644 index 0000000..4e32597 Binary files /dev/null and b/resource/ship-library/assets/portraits/252.webp differ diff --git a/resource/ship-library/assets/portraits/253.webp b/resource/ship-library/assets/portraits/253.webp new file mode 100644 index 0000000..786b6aa Binary files /dev/null and b/resource/ship-library/assets/portraits/253.webp differ diff --git a/resource/ship-library/assets/portraits/254.webp b/resource/ship-library/assets/portraits/254.webp new file mode 100644 index 0000000..78ce681 Binary files /dev/null and b/resource/ship-library/assets/portraits/254.webp differ diff --git a/resource/ship-library/assets/portraits/255.webp b/resource/ship-library/assets/portraits/255.webp new file mode 100644 index 0000000..8f53bee Binary files /dev/null and b/resource/ship-library/assets/portraits/255.webp differ diff --git a/resource/ship-library/assets/portraits/256.webp b/resource/ship-library/assets/portraits/256.webp new file mode 100644 index 0000000..26d72ef Binary files /dev/null and b/resource/ship-library/assets/portraits/256.webp differ diff --git a/resource/ship-library/assets/portraits/257.webp b/resource/ship-library/assets/portraits/257.webp new file mode 100644 index 0000000..9031220 Binary files /dev/null and b/resource/ship-library/assets/portraits/257.webp differ diff --git a/resource/ship-library/assets/portraits/258.webp b/resource/ship-library/assets/portraits/258.webp new file mode 100644 index 0000000..b44aef3 Binary files /dev/null and b/resource/ship-library/assets/portraits/258.webp differ diff --git a/resource/ship-library/assets/portraits/259.webp b/resource/ship-library/assets/portraits/259.webp new file mode 100644 index 0000000..a84b337 Binary files /dev/null and b/resource/ship-library/assets/portraits/259.webp differ diff --git a/resource/ship-library/assets/portraits/26.webp b/resource/ship-library/assets/portraits/26.webp new file mode 100644 index 0000000..29d48cc Binary files /dev/null and b/resource/ship-library/assets/portraits/26.webp differ diff --git a/resource/ship-library/assets/portraits/260.webp b/resource/ship-library/assets/portraits/260.webp new file mode 100644 index 0000000..9586dbe Binary files /dev/null and b/resource/ship-library/assets/portraits/260.webp differ diff --git a/resource/ship-library/assets/portraits/261.webp b/resource/ship-library/assets/portraits/261.webp new file mode 100644 index 0000000..3f9c499 Binary files /dev/null and b/resource/ship-library/assets/portraits/261.webp differ diff --git a/resource/ship-library/assets/portraits/262.webp b/resource/ship-library/assets/portraits/262.webp new file mode 100644 index 0000000..280b2e0 Binary files /dev/null and b/resource/ship-library/assets/portraits/262.webp differ diff --git a/resource/ship-library/assets/portraits/263.webp b/resource/ship-library/assets/portraits/263.webp new file mode 100644 index 0000000..465ea29 Binary files /dev/null and b/resource/ship-library/assets/portraits/263.webp differ diff --git a/resource/ship-library/assets/portraits/264.webp b/resource/ship-library/assets/portraits/264.webp new file mode 100644 index 0000000..fec12b7 Binary files /dev/null and b/resource/ship-library/assets/portraits/264.webp differ diff --git a/resource/ship-library/assets/portraits/265.webp b/resource/ship-library/assets/portraits/265.webp new file mode 100644 index 0000000..ed449c5 Binary files /dev/null and b/resource/ship-library/assets/portraits/265.webp differ diff --git a/resource/ship-library/assets/portraits/266.webp b/resource/ship-library/assets/portraits/266.webp new file mode 100644 index 0000000..286b00c Binary files /dev/null and b/resource/ship-library/assets/portraits/266.webp differ diff --git a/resource/ship-library/assets/portraits/267.webp b/resource/ship-library/assets/portraits/267.webp new file mode 100644 index 0000000..0c46053 Binary files /dev/null and b/resource/ship-library/assets/portraits/267.webp differ diff --git a/resource/ship-library/assets/portraits/268.webp b/resource/ship-library/assets/portraits/268.webp new file mode 100644 index 0000000..095b715 Binary files /dev/null and b/resource/ship-library/assets/portraits/268.webp differ diff --git a/resource/ship-library/assets/portraits/269.webp b/resource/ship-library/assets/portraits/269.webp new file mode 100644 index 0000000..a69afb9 Binary files /dev/null and b/resource/ship-library/assets/portraits/269.webp differ diff --git a/resource/ship-library/assets/portraits/27.webp b/resource/ship-library/assets/portraits/27.webp new file mode 100644 index 0000000..6abeb26 Binary files /dev/null and b/resource/ship-library/assets/portraits/27.webp differ diff --git a/resource/ship-library/assets/portraits/270.webp b/resource/ship-library/assets/portraits/270.webp new file mode 100644 index 0000000..d53baef Binary files /dev/null and b/resource/ship-library/assets/portraits/270.webp differ diff --git a/resource/ship-library/assets/portraits/271.webp b/resource/ship-library/assets/portraits/271.webp new file mode 100644 index 0000000..fc9ab98 Binary files /dev/null and b/resource/ship-library/assets/portraits/271.webp differ diff --git a/resource/ship-library/assets/portraits/272.webp b/resource/ship-library/assets/portraits/272.webp new file mode 100644 index 0000000..702a379 Binary files /dev/null and b/resource/ship-library/assets/portraits/272.webp differ diff --git a/resource/ship-library/assets/portraits/273.webp b/resource/ship-library/assets/portraits/273.webp new file mode 100644 index 0000000..cd8bae5 Binary files /dev/null and b/resource/ship-library/assets/portraits/273.webp differ diff --git a/resource/ship-library/assets/portraits/274.webp b/resource/ship-library/assets/portraits/274.webp new file mode 100644 index 0000000..e5cdf8c Binary files /dev/null and b/resource/ship-library/assets/portraits/274.webp differ diff --git a/resource/ship-library/assets/portraits/275.webp b/resource/ship-library/assets/portraits/275.webp new file mode 100644 index 0000000..8f12aea Binary files /dev/null and b/resource/ship-library/assets/portraits/275.webp differ diff --git a/resource/ship-library/assets/portraits/276.webp b/resource/ship-library/assets/portraits/276.webp new file mode 100644 index 0000000..cc2b027 Binary files /dev/null and b/resource/ship-library/assets/portraits/276.webp differ diff --git a/resource/ship-library/assets/portraits/277.webp b/resource/ship-library/assets/portraits/277.webp new file mode 100644 index 0000000..01e457e Binary files /dev/null and b/resource/ship-library/assets/portraits/277.webp differ diff --git a/resource/ship-library/assets/portraits/278.webp b/resource/ship-library/assets/portraits/278.webp new file mode 100644 index 0000000..1a27921 Binary files /dev/null and b/resource/ship-library/assets/portraits/278.webp differ diff --git a/resource/ship-library/assets/portraits/279.webp b/resource/ship-library/assets/portraits/279.webp new file mode 100644 index 0000000..67dcc5a Binary files /dev/null and b/resource/ship-library/assets/portraits/279.webp differ diff --git a/resource/ship-library/assets/portraits/28.webp b/resource/ship-library/assets/portraits/28.webp new file mode 100644 index 0000000..37f589a Binary files /dev/null and b/resource/ship-library/assets/portraits/28.webp differ diff --git a/resource/ship-library/assets/portraits/280.webp b/resource/ship-library/assets/portraits/280.webp new file mode 100644 index 0000000..e416986 Binary files /dev/null and b/resource/ship-library/assets/portraits/280.webp differ diff --git a/resource/ship-library/assets/portraits/281.webp b/resource/ship-library/assets/portraits/281.webp new file mode 100644 index 0000000..13fd126 Binary files /dev/null and b/resource/ship-library/assets/portraits/281.webp differ diff --git a/resource/ship-library/assets/portraits/282.webp b/resource/ship-library/assets/portraits/282.webp new file mode 100644 index 0000000..f8df04f Binary files /dev/null and b/resource/ship-library/assets/portraits/282.webp differ diff --git a/resource/ship-library/assets/portraits/283.webp b/resource/ship-library/assets/portraits/283.webp new file mode 100644 index 0000000..4532d9f Binary files /dev/null and b/resource/ship-library/assets/portraits/283.webp differ diff --git a/resource/ship-library/assets/portraits/284.webp b/resource/ship-library/assets/portraits/284.webp new file mode 100644 index 0000000..d606c56 Binary files /dev/null and b/resource/ship-library/assets/portraits/284.webp differ diff --git a/resource/ship-library/assets/portraits/285.webp b/resource/ship-library/assets/portraits/285.webp new file mode 100644 index 0000000..0c23699 Binary files /dev/null and b/resource/ship-library/assets/portraits/285.webp differ diff --git a/resource/ship-library/assets/portraits/286.webp b/resource/ship-library/assets/portraits/286.webp new file mode 100644 index 0000000..3701b42 Binary files /dev/null and b/resource/ship-library/assets/portraits/286.webp differ diff --git a/resource/ship-library/assets/portraits/287.webp b/resource/ship-library/assets/portraits/287.webp new file mode 100644 index 0000000..b6aaca4 Binary files /dev/null and b/resource/ship-library/assets/portraits/287.webp differ diff --git a/resource/ship-library/assets/portraits/288.webp b/resource/ship-library/assets/portraits/288.webp new file mode 100644 index 0000000..f4b18a6 Binary files /dev/null and b/resource/ship-library/assets/portraits/288.webp differ diff --git a/resource/ship-library/assets/portraits/289.webp b/resource/ship-library/assets/portraits/289.webp new file mode 100644 index 0000000..e602817 Binary files /dev/null and b/resource/ship-library/assets/portraits/289.webp differ diff --git a/resource/ship-library/assets/portraits/29.webp b/resource/ship-library/assets/portraits/29.webp new file mode 100644 index 0000000..a5f12f3 Binary files /dev/null and b/resource/ship-library/assets/portraits/29.webp differ diff --git a/resource/ship-library/assets/portraits/290.webp b/resource/ship-library/assets/portraits/290.webp new file mode 100644 index 0000000..123e610 Binary files /dev/null and b/resource/ship-library/assets/portraits/290.webp differ diff --git a/resource/ship-library/assets/portraits/291.webp b/resource/ship-library/assets/portraits/291.webp new file mode 100644 index 0000000..599d175 Binary files /dev/null and b/resource/ship-library/assets/portraits/291.webp differ diff --git a/resource/ship-library/assets/portraits/292.webp b/resource/ship-library/assets/portraits/292.webp new file mode 100644 index 0000000..ae260d0 Binary files /dev/null and b/resource/ship-library/assets/portraits/292.webp differ diff --git a/resource/ship-library/assets/portraits/293.webp b/resource/ship-library/assets/portraits/293.webp new file mode 100644 index 0000000..671e571 Binary files /dev/null and b/resource/ship-library/assets/portraits/293.webp differ diff --git a/resource/ship-library/assets/portraits/294.webp b/resource/ship-library/assets/portraits/294.webp new file mode 100644 index 0000000..6ac942f Binary files /dev/null and b/resource/ship-library/assets/portraits/294.webp differ diff --git a/resource/ship-library/assets/portraits/295.webp b/resource/ship-library/assets/portraits/295.webp new file mode 100644 index 0000000..b575e42 Binary files /dev/null and b/resource/ship-library/assets/portraits/295.webp differ diff --git a/resource/ship-library/assets/portraits/296.webp b/resource/ship-library/assets/portraits/296.webp new file mode 100644 index 0000000..15ee8e7 Binary files /dev/null and b/resource/ship-library/assets/portraits/296.webp differ diff --git a/resource/ship-library/assets/portraits/297.webp b/resource/ship-library/assets/portraits/297.webp new file mode 100644 index 0000000..db06e38 Binary files /dev/null and b/resource/ship-library/assets/portraits/297.webp differ diff --git a/resource/ship-library/assets/portraits/298.webp b/resource/ship-library/assets/portraits/298.webp new file mode 100644 index 0000000..1506884 Binary files /dev/null and b/resource/ship-library/assets/portraits/298.webp differ diff --git a/resource/ship-library/assets/portraits/299.webp b/resource/ship-library/assets/portraits/299.webp new file mode 100644 index 0000000..66a9715 Binary files /dev/null and b/resource/ship-library/assets/portraits/299.webp differ diff --git a/resource/ship-library/assets/portraits/3.webp b/resource/ship-library/assets/portraits/3.webp new file mode 100644 index 0000000..6420753 Binary files /dev/null and b/resource/ship-library/assets/portraits/3.webp differ diff --git a/resource/ship-library/assets/portraits/30.webp b/resource/ship-library/assets/portraits/30.webp new file mode 100644 index 0000000..7e8fb20 Binary files /dev/null and b/resource/ship-library/assets/portraits/30.webp differ diff --git a/resource/ship-library/assets/portraits/300.webp b/resource/ship-library/assets/portraits/300.webp new file mode 100644 index 0000000..e506d29 Binary files /dev/null and b/resource/ship-library/assets/portraits/300.webp differ diff --git a/resource/ship-library/assets/portraits/301.webp b/resource/ship-library/assets/portraits/301.webp new file mode 100644 index 0000000..40ec21b Binary files /dev/null and b/resource/ship-library/assets/portraits/301.webp differ diff --git a/resource/ship-library/assets/portraits/302.webp b/resource/ship-library/assets/portraits/302.webp new file mode 100644 index 0000000..1ec21ba Binary files /dev/null and b/resource/ship-library/assets/portraits/302.webp differ diff --git a/resource/ship-library/assets/portraits/303.webp b/resource/ship-library/assets/portraits/303.webp new file mode 100644 index 0000000..4a5de20 Binary files /dev/null and b/resource/ship-library/assets/portraits/303.webp differ diff --git a/resource/ship-library/assets/portraits/304.webp b/resource/ship-library/assets/portraits/304.webp new file mode 100644 index 0000000..8fabba5 Binary files /dev/null and b/resource/ship-library/assets/portraits/304.webp differ diff --git a/resource/ship-library/assets/portraits/305.webp b/resource/ship-library/assets/portraits/305.webp new file mode 100644 index 0000000..72491c4 Binary files /dev/null and b/resource/ship-library/assets/portraits/305.webp differ diff --git a/resource/ship-library/assets/portraits/306.webp b/resource/ship-library/assets/portraits/306.webp new file mode 100644 index 0000000..5f332dc Binary files /dev/null and b/resource/ship-library/assets/portraits/306.webp differ diff --git a/resource/ship-library/assets/portraits/307.webp b/resource/ship-library/assets/portraits/307.webp new file mode 100644 index 0000000..42a02bc Binary files /dev/null and b/resource/ship-library/assets/portraits/307.webp differ diff --git a/resource/ship-library/assets/portraits/308.webp b/resource/ship-library/assets/portraits/308.webp new file mode 100644 index 0000000..b2d4e28 Binary files /dev/null and b/resource/ship-library/assets/portraits/308.webp differ diff --git a/resource/ship-library/assets/portraits/309.webp b/resource/ship-library/assets/portraits/309.webp new file mode 100644 index 0000000..6068316 Binary files /dev/null and b/resource/ship-library/assets/portraits/309.webp differ diff --git a/resource/ship-library/assets/portraits/31.webp b/resource/ship-library/assets/portraits/31.webp new file mode 100644 index 0000000..4daf467 Binary files /dev/null and b/resource/ship-library/assets/portraits/31.webp differ diff --git a/resource/ship-library/assets/portraits/310.webp b/resource/ship-library/assets/portraits/310.webp new file mode 100644 index 0000000..f9b6d77 Binary files /dev/null and b/resource/ship-library/assets/portraits/310.webp differ diff --git a/resource/ship-library/assets/portraits/311.webp b/resource/ship-library/assets/portraits/311.webp new file mode 100644 index 0000000..22e55da Binary files /dev/null and b/resource/ship-library/assets/portraits/311.webp differ diff --git a/resource/ship-library/assets/portraits/312.webp b/resource/ship-library/assets/portraits/312.webp new file mode 100644 index 0000000..1562a76 Binary files /dev/null and b/resource/ship-library/assets/portraits/312.webp differ diff --git a/resource/ship-library/assets/portraits/313.webp b/resource/ship-library/assets/portraits/313.webp new file mode 100644 index 0000000..393beeb Binary files /dev/null and b/resource/ship-library/assets/portraits/313.webp differ diff --git a/resource/ship-library/assets/portraits/314.webp b/resource/ship-library/assets/portraits/314.webp new file mode 100644 index 0000000..9dedb54 Binary files /dev/null and b/resource/ship-library/assets/portraits/314.webp differ diff --git a/resource/ship-library/assets/portraits/315.webp b/resource/ship-library/assets/portraits/315.webp new file mode 100644 index 0000000..f8c29aa Binary files /dev/null and b/resource/ship-library/assets/portraits/315.webp differ diff --git a/resource/ship-library/assets/portraits/316.webp b/resource/ship-library/assets/portraits/316.webp new file mode 100644 index 0000000..4ec7d12 Binary files /dev/null and b/resource/ship-library/assets/portraits/316.webp differ diff --git a/resource/ship-library/assets/portraits/317.webp b/resource/ship-library/assets/portraits/317.webp new file mode 100644 index 0000000..9f05ef9 Binary files /dev/null and b/resource/ship-library/assets/portraits/317.webp differ diff --git a/resource/ship-library/assets/portraits/318.webp b/resource/ship-library/assets/portraits/318.webp new file mode 100644 index 0000000..ac954ac Binary files /dev/null and b/resource/ship-library/assets/portraits/318.webp differ diff --git a/resource/ship-library/assets/portraits/319.webp b/resource/ship-library/assets/portraits/319.webp new file mode 100644 index 0000000..76bf86c Binary files /dev/null and b/resource/ship-library/assets/portraits/319.webp differ diff --git a/resource/ship-library/assets/portraits/32.webp b/resource/ship-library/assets/portraits/32.webp new file mode 100644 index 0000000..68d71de Binary files /dev/null and b/resource/ship-library/assets/portraits/32.webp differ diff --git a/resource/ship-library/assets/portraits/320.webp b/resource/ship-library/assets/portraits/320.webp new file mode 100644 index 0000000..4dcbb05 Binary files /dev/null and b/resource/ship-library/assets/portraits/320.webp differ diff --git a/resource/ship-library/assets/portraits/321.webp b/resource/ship-library/assets/portraits/321.webp new file mode 100644 index 0000000..4388547 Binary files /dev/null and b/resource/ship-library/assets/portraits/321.webp differ diff --git a/resource/ship-library/assets/portraits/322.webp b/resource/ship-library/assets/portraits/322.webp new file mode 100644 index 0000000..1825b12 Binary files /dev/null and b/resource/ship-library/assets/portraits/322.webp differ diff --git a/resource/ship-library/assets/portraits/323.webp b/resource/ship-library/assets/portraits/323.webp new file mode 100644 index 0000000..4bf920a Binary files /dev/null and b/resource/ship-library/assets/portraits/323.webp differ diff --git a/resource/ship-library/assets/portraits/324.webp b/resource/ship-library/assets/portraits/324.webp new file mode 100644 index 0000000..4d2a8b8 Binary files /dev/null and b/resource/ship-library/assets/portraits/324.webp differ diff --git a/resource/ship-library/assets/portraits/325.webp b/resource/ship-library/assets/portraits/325.webp new file mode 100644 index 0000000..48d9c35 Binary files /dev/null and b/resource/ship-library/assets/portraits/325.webp differ diff --git a/resource/ship-library/assets/portraits/326.webp b/resource/ship-library/assets/portraits/326.webp new file mode 100644 index 0000000..b746ee6 Binary files /dev/null and b/resource/ship-library/assets/portraits/326.webp differ diff --git a/resource/ship-library/assets/portraits/327.webp b/resource/ship-library/assets/portraits/327.webp new file mode 100644 index 0000000..5a7688d Binary files /dev/null and b/resource/ship-library/assets/portraits/327.webp differ diff --git a/resource/ship-library/assets/portraits/328.webp b/resource/ship-library/assets/portraits/328.webp new file mode 100644 index 0000000..c83b192 Binary files /dev/null and b/resource/ship-library/assets/portraits/328.webp differ diff --git a/resource/ship-library/assets/portraits/329.webp b/resource/ship-library/assets/portraits/329.webp new file mode 100644 index 0000000..914fc57 Binary files /dev/null and b/resource/ship-library/assets/portraits/329.webp differ diff --git a/resource/ship-library/assets/portraits/33.webp b/resource/ship-library/assets/portraits/33.webp new file mode 100644 index 0000000..f1f2ad5 Binary files /dev/null and b/resource/ship-library/assets/portraits/33.webp differ diff --git a/resource/ship-library/assets/portraits/330.webp b/resource/ship-library/assets/portraits/330.webp new file mode 100644 index 0000000..34929e4 Binary files /dev/null and b/resource/ship-library/assets/portraits/330.webp differ diff --git a/resource/ship-library/assets/portraits/331.webp b/resource/ship-library/assets/portraits/331.webp new file mode 100644 index 0000000..29f61e6 Binary files /dev/null and b/resource/ship-library/assets/portraits/331.webp differ diff --git a/resource/ship-library/assets/portraits/332.webp b/resource/ship-library/assets/portraits/332.webp new file mode 100644 index 0000000..cb3fb4e Binary files /dev/null and b/resource/ship-library/assets/portraits/332.webp differ diff --git a/resource/ship-library/assets/portraits/333.webp b/resource/ship-library/assets/portraits/333.webp new file mode 100644 index 0000000..649669e Binary files /dev/null and b/resource/ship-library/assets/portraits/333.webp differ diff --git a/resource/ship-library/assets/portraits/334.webp b/resource/ship-library/assets/portraits/334.webp new file mode 100644 index 0000000..1af11bf Binary files /dev/null and b/resource/ship-library/assets/portraits/334.webp differ diff --git a/resource/ship-library/assets/portraits/335.webp b/resource/ship-library/assets/portraits/335.webp new file mode 100644 index 0000000..f9bb5dd Binary files /dev/null and b/resource/ship-library/assets/portraits/335.webp differ diff --git a/resource/ship-library/assets/portraits/336.webp b/resource/ship-library/assets/portraits/336.webp new file mode 100644 index 0000000..3c30953 Binary files /dev/null and b/resource/ship-library/assets/portraits/336.webp differ diff --git a/resource/ship-library/assets/portraits/337.webp b/resource/ship-library/assets/portraits/337.webp new file mode 100644 index 0000000..8f295d5 Binary files /dev/null and b/resource/ship-library/assets/portraits/337.webp differ diff --git a/resource/ship-library/assets/portraits/338.webp b/resource/ship-library/assets/portraits/338.webp new file mode 100644 index 0000000..eaed6d0 Binary files /dev/null and b/resource/ship-library/assets/portraits/338.webp differ diff --git a/resource/ship-library/assets/portraits/339.webp b/resource/ship-library/assets/portraits/339.webp new file mode 100644 index 0000000..8ad8d8b Binary files /dev/null and b/resource/ship-library/assets/portraits/339.webp differ diff --git a/resource/ship-library/assets/portraits/34.webp b/resource/ship-library/assets/portraits/34.webp new file mode 100644 index 0000000..e2469a1 Binary files /dev/null and b/resource/ship-library/assets/portraits/34.webp differ diff --git a/resource/ship-library/assets/portraits/340.webp b/resource/ship-library/assets/portraits/340.webp new file mode 100644 index 0000000..4e39480 Binary files /dev/null and b/resource/ship-library/assets/portraits/340.webp differ diff --git a/resource/ship-library/assets/portraits/341.webp b/resource/ship-library/assets/portraits/341.webp new file mode 100644 index 0000000..5e3fa0e Binary files /dev/null and b/resource/ship-library/assets/portraits/341.webp differ diff --git a/resource/ship-library/assets/portraits/342.webp b/resource/ship-library/assets/portraits/342.webp new file mode 100644 index 0000000..8770a9d Binary files /dev/null and b/resource/ship-library/assets/portraits/342.webp differ diff --git a/resource/ship-library/assets/portraits/343.webp b/resource/ship-library/assets/portraits/343.webp new file mode 100644 index 0000000..5a124a5 Binary files /dev/null and b/resource/ship-library/assets/portraits/343.webp differ diff --git a/resource/ship-library/assets/portraits/344.webp b/resource/ship-library/assets/portraits/344.webp new file mode 100644 index 0000000..0a17735 Binary files /dev/null and b/resource/ship-library/assets/portraits/344.webp differ diff --git a/resource/ship-library/assets/portraits/345.webp b/resource/ship-library/assets/portraits/345.webp new file mode 100644 index 0000000..f938be2 Binary files /dev/null and b/resource/ship-library/assets/portraits/345.webp differ diff --git a/resource/ship-library/assets/portraits/346.webp b/resource/ship-library/assets/portraits/346.webp new file mode 100644 index 0000000..fe55305 Binary files /dev/null and b/resource/ship-library/assets/portraits/346.webp differ diff --git a/resource/ship-library/assets/portraits/347.webp b/resource/ship-library/assets/portraits/347.webp new file mode 100644 index 0000000..d73dad1 Binary files /dev/null and b/resource/ship-library/assets/portraits/347.webp differ diff --git a/resource/ship-library/assets/portraits/348.webp b/resource/ship-library/assets/portraits/348.webp new file mode 100644 index 0000000..243a742 Binary files /dev/null and b/resource/ship-library/assets/portraits/348.webp differ diff --git a/resource/ship-library/assets/portraits/349.webp b/resource/ship-library/assets/portraits/349.webp new file mode 100644 index 0000000..f166ce7 Binary files /dev/null and b/resource/ship-library/assets/portraits/349.webp differ diff --git a/resource/ship-library/assets/portraits/35.webp b/resource/ship-library/assets/portraits/35.webp new file mode 100644 index 0000000..80b252b Binary files /dev/null and b/resource/ship-library/assets/portraits/35.webp differ diff --git a/resource/ship-library/assets/portraits/350.webp b/resource/ship-library/assets/portraits/350.webp new file mode 100644 index 0000000..51d4772 Binary files /dev/null and b/resource/ship-library/assets/portraits/350.webp differ diff --git a/resource/ship-library/assets/portraits/351.webp b/resource/ship-library/assets/portraits/351.webp new file mode 100644 index 0000000..e2f81a2 Binary files /dev/null and b/resource/ship-library/assets/portraits/351.webp differ diff --git a/resource/ship-library/assets/portraits/352.webp b/resource/ship-library/assets/portraits/352.webp new file mode 100644 index 0000000..d58c462 Binary files /dev/null and b/resource/ship-library/assets/portraits/352.webp differ diff --git a/resource/ship-library/assets/portraits/353.webp b/resource/ship-library/assets/portraits/353.webp new file mode 100644 index 0000000..daa6f93 Binary files /dev/null and b/resource/ship-library/assets/portraits/353.webp differ diff --git a/resource/ship-library/assets/portraits/354.webp b/resource/ship-library/assets/portraits/354.webp new file mode 100644 index 0000000..eb4ae85 Binary files /dev/null and b/resource/ship-library/assets/portraits/354.webp differ diff --git a/resource/ship-library/assets/portraits/355.webp b/resource/ship-library/assets/portraits/355.webp new file mode 100644 index 0000000..6e0cc21 Binary files /dev/null and b/resource/ship-library/assets/portraits/355.webp differ diff --git a/resource/ship-library/assets/portraits/356.webp b/resource/ship-library/assets/portraits/356.webp new file mode 100644 index 0000000..d20952d Binary files /dev/null and b/resource/ship-library/assets/portraits/356.webp differ diff --git a/resource/ship-library/assets/portraits/357.webp b/resource/ship-library/assets/portraits/357.webp new file mode 100644 index 0000000..8ebf7ef Binary files /dev/null and b/resource/ship-library/assets/portraits/357.webp differ diff --git a/resource/ship-library/assets/portraits/358.webp b/resource/ship-library/assets/portraits/358.webp new file mode 100644 index 0000000..880dae4 Binary files /dev/null and b/resource/ship-library/assets/portraits/358.webp differ diff --git a/resource/ship-library/assets/portraits/359.webp b/resource/ship-library/assets/portraits/359.webp new file mode 100644 index 0000000..8ff75bc Binary files /dev/null and b/resource/ship-library/assets/portraits/359.webp differ diff --git a/resource/ship-library/assets/portraits/36.webp b/resource/ship-library/assets/portraits/36.webp new file mode 100644 index 0000000..67a1546 Binary files /dev/null and b/resource/ship-library/assets/portraits/36.webp differ diff --git a/resource/ship-library/assets/portraits/360.webp b/resource/ship-library/assets/portraits/360.webp new file mode 100644 index 0000000..ac481ef Binary files /dev/null and b/resource/ship-library/assets/portraits/360.webp differ diff --git a/resource/ship-library/assets/portraits/361.webp b/resource/ship-library/assets/portraits/361.webp new file mode 100644 index 0000000..bdc0a78 Binary files /dev/null and b/resource/ship-library/assets/portraits/361.webp differ diff --git a/resource/ship-library/assets/portraits/362.webp b/resource/ship-library/assets/portraits/362.webp new file mode 100644 index 0000000..dff2592 Binary files /dev/null and b/resource/ship-library/assets/portraits/362.webp differ diff --git a/resource/ship-library/assets/portraits/363.webp b/resource/ship-library/assets/portraits/363.webp new file mode 100644 index 0000000..b2c7881 Binary files /dev/null and b/resource/ship-library/assets/portraits/363.webp differ diff --git a/resource/ship-library/assets/portraits/364.webp b/resource/ship-library/assets/portraits/364.webp new file mode 100644 index 0000000..1c4ff22 Binary files /dev/null and b/resource/ship-library/assets/portraits/364.webp differ diff --git a/resource/ship-library/assets/portraits/365.webp b/resource/ship-library/assets/portraits/365.webp new file mode 100644 index 0000000..26339aa Binary files /dev/null and b/resource/ship-library/assets/portraits/365.webp differ diff --git a/resource/ship-library/assets/portraits/366.webp b/resource/ship-library/assets/portraits/366.webp new file mode 100644 index 0000000..5c1b5f6 Binary files /dev/null and b/resource/ship-library/assets/portraits/366.webp differ diff --git a/resource/ship-library/assets/portraits/367.webp b/resource/ship-library/assets/portraits/367.webp new file mode 100644 index 0000000..926c1ea Binary files /dev/null and b/resource/ship-library/assets/portraits/367.webp differ diff --git a/resource/ship-library/assets/portraits/368.webp b/resource/ship-library/assets/portraits/368.webp new file mode 100644 index 0000000..68733cc Binary files /dev/null and b/resource/ship-library/assets/portraits/368.webp differ diff --git a/resource/ship-library/assets/portraits/369.webp b/resource/ship-library/assets/portraits/369.webp new file mode 100644 index 0000000..ca07808 Binary files /dev/null and b/resource/ship-library/assets/portraits/369.webp differ diff --git a/resource/ship-library/assets/portraits/37.webp b/resource/ship-library/assets/portraits/37.webp new file mode 100644 index 0000000..1de4e0b Binary files /dev/null and b/resource/ship-library/assets/portraits/37.webp differ diff --git a/resource/ship-library/assets/portraits/370.webp b/resource/ship-library/assets/portraits/370.webp new file mode 100644 index 0000000..fc57c25 Binary files /dev/null and b/resource/ship-library/assets/portraits/370.webp differ diff --git a/resource/ship-library/assets/portraits/371.webp b/resource/ship-library/assets/portraits/371.webp new file mode 100644 index 0000000..199f483 Binary files /dev/null and b/resource/ship-library/assets/portraits/371.webp differ diff --git a/resource/ship-library/assets/portraits/372.webp b/resource/ship-library/assets/portraits/372.webp new file mode 100644 index 0000000..50d46c5 Binary files /dev/null and b/resource/ship-library/assets/portraits/372.webp differ diff --git a/resource/ship-library/assets/portraits/373.webp b/resource/ship-library/assets/portraits/373.webp new file mode 100644 index 0000000..51fe32a Binary files /dev/null and b/resource/ship-library/assets/portraits/373.webp differ diff --git a/resource/ship-library/assets/portraits/374.webp b/resource/ship-library/assets/portraits/374.webp new file mode 100644 index 0000000..647e476 Binary files /dev/null and b/resource/ship-library/assets/portraits/374.webp differ diff --git a/resource/ship-library/assets/portraits/375.webp b/resource/ship-library/assets/portraits/375.webp new file mode 100644 index 0000000..91b6863 Binary files /dev/null and b/resource/ship-library/assets/portraits/375.webp differ diff --git a/resource/ship-library/assets/portraits/376.webp b/resource/ship-library/assets/portraits/376.webp new file mode 100644 index 0000000..8aa0fe7 Binary files /dev/null and b/resource/ship-library/assets/portraits/376.webp differ diff --git a/resource/ship-library/assets/portraits/377.webp b/resource/ship-library/assets/portraits/377.webp new file mode 100644 index 0000000..2e4a606 Binary files /dev/null and b/resource/ship-library/assets/portraits/377.webp differ diff --git a/resource/ship-library/assets/portraits/378.webp b/resource/ship-library/assets/portraits/378.webp new file mode 100644 index 0000000..3482f65 Binary files /dev/null and b/resource/ship-library/assets/portraits/378.webp differ diff --git a/resource/ship-library/assets/portraits/379.webp b/resource/ship-library/assets/portraits/379.webp new file mode 100644 index 0000000..0044b65 Binary files /dev/null and b/resource/ship-library/assets/portraits/379.webp differ diff --git a/resource/ship-library/assets/portraits/38.webp b/resource/ship-library/assets/portraits/38.webp new file mode 100644 index 0000000..3a21a51 Binary files /dev/null and b/resource/ship-library/assets/portraits/38.webp differ diff --git a/resource/ship-library/assets/portraits/380.webp b/resource/ship-library/assets/portraits/380.webp new file mode 100644 index 0000000..16cea47 Binary files /dev/null and b/resource/ship-library/assets/portraits/380.webp differ diff --git a/resource/ship-library/assets/portraits/381.webp b/resource/ship-library/assets/portraits/381.webp new file mode 100644 index 0000000..23fda80 Binary files /dev/null and b/resource/ship-library/assets/portraits/381.webp differ diff --git a/resource/ship-library/assets/portraits/382.webp b/resource/ship-library/assets/portraits/382.webp new file mode 100644 index 0000000..e3b7390 Binary files /dev/null and b/resource/ship-library/assets/portraits/382.webp differ diff --git a/resource/ship-library/assets/portraits/383.webp b/resource/ship-library/assets/portraits/383.webp new file mode 100644 index 0000000..c303e91 Binary files /dev/null and b/resource/ship-library/assets/portraits/383.webp differ diff --git a/resource/ship-library/assets/portraits/384.webp b/resource/ship-library/assets/portraits/384.webp new file mode 100644 index 0000000..f58cb07 Binary files /dev/null and b/resource/ship-library/assets/portraits/384.webp differ diff --git a/resource/ship-library/assets/portraits/385.webp b/resource/ship-library/assets/portraits/385.webp new file mode 100644 index 0000000..5448258 Binary files /dev/null and b/resource/ship-library/assets/portraits/385.webp differ diff --git a/resource/ship-library/assets/portraits/386.webp b/resource/ship-library/assets/portraits/386.webp new file mode 100644 index 0000000..25a3a2f Binary files /dev/null and b/resource/ship-library/assets/portraits/386.webp differ diff --git a/resource/ship-library/assets/portraits/387.webp b/resource/ship-library/assets/portraits/387.webp new file mode 100644 index 0000000..ac2b850 Binary files /dev/null and b/resource/ship-library/assets/portraits/387.webp differ diff --git a/resource/ship-library/assets/portraits/388.webp b/resource/ship-library/assets/portraits/388.webp new file mode 100644 index 0000000..cbd392a Binary files /dev/null and b/resource/ship-library/assets/portraits/388.webp differ diff --git a/resource/ship-library/assets/portraits/389.webp b/resource/ship-library/assets/portraits/389.webp new file mode 100644 index 0000000..4b12039 Binary files /dev/null and b/resource/ship-library/assets/portraits/389.webp differ diff --git a/resource/ship-library/assets/portraits/39.webp b/resource/ship-library/assets/portraits/39.webp new file mode 100644 index 0000000..008589f Binary files /dev/null and b/resource/ship-library/assets/portraits/39.webp differ diff --git a/resource/ship-library/assets/portraits/390.webp b/resource/ship-library/assets/portraits/390.webp new file mode 100644 index 0000000..7a7b3c4 Binary files /dev/null and b/resource/ship-library/assets/portraits/390.webp differ diff --git a/resource/ship-library/assets/portraits/391.webp b/resource/ship-library/assets/portraits/391.webp new file mode 100644 index 0000000..c74d8a2 Binary files /dev/null and b/resource/ship-library/assets/portraits/391.webp differ diff --git a/resource/ship-library/assets/portraits/392.webp b/resource/ship-library/assets/portraits/392.webp new file mode 100644 index 0000000..2c3204b Binary files /dev/null and b/resource/ship-library/assets/portraits/392.webp differ diff --git a/resource/ship-library/assets/portraits/393.webp b/resource/ship-library/assets/portraits/393.webp new file mode 100644 index 0000000..627b66b Binary files /dev/null and b/resource/ship-library/assets/portraits/393.webp differ diff --git a/resource/ship-library/assets/portraits/394.webp b/resource/ship-library/assets/portraits/394.webp new file mode 100644 index 0000000..7b0b8da Binary files /dev/null and b/resource/ship-library/assets/portraits/394.webp differ diff --git a/resource/ship-library/assets/portraits/395.webp b/resource/ship-library/assets/portraits/395.webp new file mode 100644 index 0000000..984d7c1 Binary files /dev/null and b/resource/ship-library/assets/portraits/395.webp differ diff --git a/resource/ship-library/assets/portraits/396.webp b/resource/ship-library/assets/portraits/396.webp new file mode 100644 index 0000000..a2adec1 Binary files /dev/null and b/resource/ship-library/assets/portraits/396.webp differ diff --git a/resource/ship-library/assets/portraits/397.webp b/resource/ship-library/assets/portraits/397.webp new file mode 100644 index 0000000..4824f79 Binary files /dev/null and b/resource/ship-library/assets/portraits/397.webp differ diff --git a/resource/ship-library/assets/portraits/398.webp b/resource/ship-library/assets/portraits/398.webp new file mode 100644 index 0000000..2c69f62 Binary files /dev/null and b/resource/ship-library/assets/portraits/398.webp differ diff --git a/resource/ship-library/assets/portraits/399.webp b/resource/ship-library/assets/portraits/399.webp new file mode 100644 index 0000000..912c1bf Binary files /dev/null and b/resource/ship-library/assets/portraits/399.webp differ diff --git a/resource/ship-library/assets/portraits/4.webp b/resource/ship-library/assets/portraits/4.webp new file mode 100644 index 0000000..8e706f1 Binary files /dev/null and b/resource/ship-library/assets/portraits/4.webp differ diff --git a/resource/ship-library/assets/portraits/40.webp b/resource/ship-library/assets/portraits/40.webp new file mode 100644 index 0000000..f186138 Binary files /dev/null and b/resource/ship-library/assets/portraits/40.webp differ diff --git a/resource/ship-library/assets/portraits/400.webp b/resource/ship-library/assets/portraits/400.webp new file mode 100644 index 0000000..69ad733 Binary files /dev/null and b/resource/ship-library/assets/portraits/400.webp differ diff --git a/resource/ship-library/assets/portraits/401.webp b/resource/ship-library/assets/portraits/401.webp new file mode 100644 index 0000000..8c69d1c Binary files /dev/null and b/resource/ship-library/assets/portraits/401.webp differ diff --git a/resource/ship-library/assets/portraits/402.webp b/resource/ship-library/assets/portraits/402.webp new file mode 100644 index 0000000..b046e0d Binary files /dev/null and b/resource/ship-library/assets/portraits/402.webp differ diff --git a/resource/ship-library/assets/portraits/403.webp b/resource/ship-library/assets/portraits/403.webp new file mode 100644 index 0000000..6ad4af7 Binary files /dev/null and b/resource/ship-library/assets/portraits/403.webp differ diff --git a/resource/ship-library/assets/portraits/404.webp b/resource/ship-library/assets/portraits/404.webp new file mode 100644 index 0000000..89746e0 Binary files /dev/null and b/resource/ship-library/assets/portraits/404.webp differ diff --git a/resource/ship-library/assets/portraits/405.webp b/resource/ship-library/assets/portraits/405.webp new file mode 100644 index 0000000..22dc5bd Binary files /dev/null and b/resource/ship-library/assets/portraits/405.webp differ diff --git a/resource/ship-library/assets/portraits/406.webp b/resource/ship-library/assets/portraits/406.webp new file mode 100644 index 0000000..eb1e289 Binary files /dev/null and b/resource/ship-library/assets/portraits/406.webp differ diff --git a/resource/ship-library/assets/portraits/407.webp b/resource/ship-library/assets/portraits/407.webp new file mode 100644 index 0000000..fe31f3f Binary files /dev/null and b/resource/ship-library/assets/portraits/407.webp differ diff --git a/resource/ship-library/assets/portraits/408.webp b/resource/ship-library/assets/portraits/408.webp new file mode 100644 index 0000000..1c1f73b Binary files /dev/null and b/resource/ship-library/assets/portraits/408.webp differ diff --git a/resource/ship-library/assets/portraits/409.webp b/resource/ship-library/assets/portraits/409.webp new file mode 100644 index 0000000..72aa536 Binary files /dev/null and b/resource/ship-library/assets/portraits/409.webp differ diff --git a/resource/ship-library/assets/portraits/41.webp b/resource/ship-library/assets/portraits/41.webp new file mode 100644 index 0000000..9a8ecea Binary files /dev/null and b/resource/ship-library/assets/portraits/41.webp differ diff --git a/resource/ship-library/assets/portraits/410.webp b/resource/ship-library/assets/portraits/410.webp new file mode 100644 index 0000000..a703a85 Binary files /dev/null and b/resource/ship-library/assets/portraits/410.webp differ diff --git a/resource/ship-library/assets/portraits/411.webp b/resource/ship-library/assets/portraits/411.webp new file mode 100644 index 0000000..7ffcbb2 Binary files /dev/null and b/resource/ship-library/assets/portraits/411.webp differ diff --git a/resource/ship-library/assets/portraits/412.webp b/resource/ship-library/assets/portraits/412.webp new file mode 100644 index 0000000..505c3a0 Binary files /dev/null and b/resource/ship-library/assets/portraits/412.webp differ diff --git a/resource/ship-library/assets/portraits/413.webp b/resource/ship-library/assets/portraits/413.webp new file mode 100644 index 0000000..d4f903e Binary files /dev/null and b/resource/ship-library/assets/portraits/413.webp differ diff --git a/resource/ship-library/assets/portraits/414.webp b/resource/ship-library/assets/portraits/414.webp new file mode 100644 index 0000000..a01dfe8 Binary files /dev/null and b/resource/ship-library/assets/portraits/414.webp differ diff --git a/resource/ship-library/assets/portraits/415.webp b/resource/ship-library/assets/portraits/415.webp new file mode 100644 index 0000000..70066a2 Binary files /dev/null and b/resource/ship-library/assets/portraits/415.webp differ diff --git a/resource/ship-library/assets/portraits/416.webp b/resource/ship-library/assets/portraits/416.webp new file mode 100644 index 0000000..d321480 Binary files /dev/null and b/resource/ship-library/assets/portraits/416.webp differ diff --git a/resource/ship-library/assets/portraits/417.webp b/resource/ship-library/assets/portraits/417.webp new file mode 100644 index 0000000..7390faf Binary files /dev/null and b/resource/ship-library/assets/portraits/417.webp differ diff --git a/resource/ship-library/assets/portraits/418.webp b/resource/ship-library/assets/portraits/418.webp new file mode 100644 index 0000000..ce915f5 Binary files /dev/null and b/resource/ship-library/assets/portraits/418.webp differ diff --git a/resource/ship-library/assets/portraits/419.webp b/resource/ship-library/assets/portraits/419.webp new file mode 100644 index 0000000..0f332ff Binary files /dev/null and b/resource/ship-library/assets/portraits/419.webp differ diff --git a/resource/ship-library/assets/portraits/42.webp b/resource/ship-library/assets/portraits/42.webp new file mode 100644 index 0000000..6136df0 Binary files /dev/null and b/resource/ship-library/assets/portraits/42.webp differ diff --git a/resource/ship-library/assets/portraits/420.webp b/resource/ship-library/assets/portraits/420.webp new file mode 100644 index 0000000..907fde9 Binary files /dev/null and b/resource/ship-library/assets/portraits/420.webp differ diff --git a/resource/ship-library/assets/portraits/421.webp b/resource/ship-library/assets/portraits/421.webp new file mode 100644 index 0000000..751f6c6 Binary files /dev/null and b/resource/ship-library/assets/portraits/421.webp differ diff --git a/resource/ship-library/assets/portraits/422.webp b/resource/ship-library/assets/portraits/422.webp new file mode 100644 index 0000000..923d441 Binary files /dev/null and b/resource/ship-library/assets/portraits/422.webp differ diff --git a/resource/ship-library/assets/portraits/423.webp b/resource/ship-library/assets/portraits/423.webp new file mode 100644 index 0000000..3f0a182 Binary files /dev/null and b/resource/ship-library/assets/portraits/423.webp differ diff --git a/resource/ship-library/assets/portraits/424.webp b/resource/ship-library/assets/portraits/424.webp new file mode 100644 index 0000000..44b0d50 Binary files /dev/null and b/resource/ship-library/assets/portraits/424.webp differ diff --git a/resource/ship-library/assets/portraits/425.webp b/resource/ship-library/assets/portraits/425.webp new file mode 100644 index 0000000..7a1c8df Binary files /dev/null and b/resource/ship-library/assets/portraits/425.webp differ diff --git a/resource/ship-library/assets/portraits/426.webp b/resource/ship-library/assets/portraits/426.webp new file mode 100644 index 0000000..ea8ac17 Binary files /dev/null and b/resource/ship-library/assets/portraits/426.webp differ diff --git a/resource/ship-library/assets/portraits/427.webp b/resource/ship-library/assets/portraits/427.webp new file mode 100644 index 0000000..ccbd52a Binary files /dev/null and b/resource/ship-library/assets/portraits/427.webp differ diff --git a/resource/ship-library/assets/portraits/428.webp b/resource/ship-library/assets/portraits/428.webp new file mode 100644 index 0000000..5ca9e36 Binary files /dev/null and b/resource/ship-library/assets/portraits/428.webp differ diff --git a/resource/ship-library/assets/portraits/429.webp b/resource/ship-library/assets/portraits/429.webp new file mode 100644 index 0000000..ff7df57 Binary files /dev/null and b/resource/ship-library/assets/portraits/429.webp differ diff --git a/resource/ship-library/assets/portraits/43.webp b/resource/ship-library/assets/portraits/43.webp new file mode 100644 index 0000000..c118d57 Binary files /dev/null and b/resource/ship-library/assets/portraits/43.webp differ diff --git a/resource/ship-library/assets/portraits/430.webp b/resource/ship-library/assets/portraits/430.webp new file mode 100644 index 0000000..7eb8b21 Binary files /dev/null and b/resource/ship-library/assets/portraits/430.webp differ diff --git a/resource/ship-library/assets/portraits/431.webp b/resource/ship-library/assets/portraits/431.webp new file mode 100644 index 0000000..faf7887 Binary files /dev/null and b/resource/ship-library/assets/portraits/431.webp differ diff --git a/resource/ship-library/assets/portraits/432.webp b/resource/ship-library/assets/portraits/432.webp new file mode 100644 index 0000000..78ad07f Binary files /dev/null and b/resource/ship-library/assets/portraits/432.webp differ diff --git a/resource/ship-library/assets/portraits/433.webp b/resource/ship-library/assets/portraits/433.webp new file mode 100644 index 0000000..60d82b1 Binary files /dev/null and b/resource/ship-library/assets/portraits/433.webp differ diff --git a/resource/ship-library/assets/portraits/434.webp b/resource/ship-library/assets/portraits/434.webp new file mode 100644 index 0000000..c20f2ff Binary files /dev/null and b/resource/ship-library/assets/portraits/434.webp differ diff --git a/resource/ship-library/assets/portraits/435.webp b/resource/ship-library/assets/portraits/435.webp new file mode 100644 index 0000000..79bf048 Binary files /dev/null and b/resource/ship-library/assets/portraits/435.webp differ diff --git a/resource/ship-library/assets/portraits/436.webp b/resource/ship-library/assets/portraits/436.webp new file mode 100644 index 0000000..92afee0 Binary files /dev/null and b/resource/ship-library/assets/portraits/436.webp differ diff --git a/resource/ship-library/assets/portraits/437.webp b/resource/ship-library/assets/portraits/437.webp new file mode 100644 index 0000000..fe8c785 Binary files /dev/null and b/resource/ship-library/assets/portraits/437.webp differ diff --git a/resource/ship-library/assets/portraits/438.webp b/resource/ship-library/assets/portraits/438.webp new file mode 100644 index 0000000..7224c33 Binary files /dev/null and b/resource/ship-library/assets/portraits/438.webp differ diff --git a/resource/ship-library/assets/portraits/439.webp b/resource/ship-library/assets/portraits/439.webp new file mode 100644 index 0000000..74e853b Binary files /dev/null and b/resource/ship-library/assets/portraits/439.webp differ diff --git a/resource/ship-library/assets/portraits/44.webp b/resource/ship-library/assets/portraits/44.webp new file mode 100644 index 0000000..d390c1f Binary files /dev/null and b/resource/ship-library/assets/portraits/44.webp differ diff --git a/resource/ship-library/assets/portraits/440.webp b/resource/ship-library/assets/portraits/440.webp new file mode 100644 index 0000000..980846e Binary files /dev/null and b/resource/ship-library/assets/portraits/440.webp differ diff --git a/resource/ship-library/assets/portraits/441.webp b/resource/ship-library/assets/portraits/441.webp new file mode 100644 index 0000000..c6f7ff9 Binary files /dev/null and b/resource/ship-library/assets/portraits/441.webp differ diff --git a/resource/ship-library/assets/portraits/442.webp b/resource/ship-library/assets/portraits/442.webp new file mode 100644 index 0000000..13bcf0a Binary files /dev/null and b/resource/ship-library/assets/portraits/442.webp differ diff --git a/resource/ship-library/assets/portraits/443.webp b/resource/ship-library/assets/portraits/443.webp new file mode 100644 index 0000000..2efb9cf Binary files /dev/null and b/resource/ship-library/assets/portraits/443.webp differ diff --git a/resource/ship-library/assets/portraits/444.webp b/resource/ship-library/assets/portraits/444.webp new file mode 100644 index 0000000..0ab58b5 Binary files /dev/null and b/resource/ship-library/assets/portraits/444.webp differ diff --git a/resource/ship-library/assets/portraits/445.webp b/resource/ship-library/assets/portraits/445.webp new file mode 100644 index 0000000..0f09ef9 Binary files /dev/null and b/resource/ship-library/assets/portraits/445.webp differ diff --git a/resource/ship-library/assets/portraits/446.webp b/resource/ship-library/assets/portraits/446.webp new file mode 100644 index 0000000..d07b283 Binary files /dev/null and b/resource/ship-library/assets/portraits/446.webp differ diff --git a/resource/ship-library/assets/portraits/447.webp b/resource/ship-library/assets/portraits/447.webp new file mode 100644 index 0000000..a048545 Binary files /dev/null and b/resource/ship-library/assets/portraits/447.webp differ diff --git a/resource/ship-library/assets/portraits/448.webp b/resource/ship-library/assets/portraits/448.webp new file mode 100644 index 0000000..e37f03b Binary files /dev/null and b/resource/ship-library/assets/portraits/448.webp differ diff --git a/resource/ship-library/assets/portraits/449.webp b/resource/ship-library/assets/portraits/449.webp new file mode 100644 index 0000000..ca1333f Binary files /dev/null and b/resource/ship-library/assets/portraits/449.webp differ diff --git a/resource/ship-library/assets/portraits/45.webp b/resource/ship-library/assets/portraits/45.webp new file mode 100644 index 0000000..a2816f2 Binary files /dev/null and b/resource/ship-library/assets/portraits/45.webp differ diff --git a/resource/ship-library/assets/portraits/450.webp b/resource/ship-library/assets/portraits/450.webp new file mode 100644 index 0000000..98d0c97 Binary files /dev/null and b/resource/ship-library/assets/portraits/450.webp differ diff --git a/resource/ship-library/assets/portraits/451.webp b/resource/ship-library/assets/portraits/451.webp new file mode 100644 index 0000000..0d2a717 Binary files /dev/null and b/resource/ship-library/assets/portraits/451.webp differ diff --git a/resource/ship-library/assets/portraits/452.webp b/resource/ship-library/assets/portraits/452.webp new file mode 100644 index 0000000..60307d6 Binary files /dev/null and b/resource/ship-library/assets/portraits/452.webp differ diff --git a/resource/ship-library/assets/portraits/453.webp b/resource/ship-library/assets/portraits/453.webp new file mode 100644 index 0000000..95edf13 Binary files /dev/null and b/resource/ship-library/assets/portraits/453.webp differ diff --git a/resource/ship-library/assets/portraits/454.webp b/resource/ship-library/assets/portraits/454.webp new file mode 100644 index 0000000..45f7ab1 Binary files /dev/null and b/resource/ship-library/assets/portraits/454.webp differ diff --git a/resource/ship-library/assets/portraits/455.webp b/resource/ship-library/assets/portraits/455.webp new file mode 100644 index 0000000..950ab3a Binary files /dev/null and b/resource/ship-library/assets/portraits/455.webp differ diff --git a/resource/ship-library/assets/portraits/456.webp b/resource/ship-library/assets/portraits/456.webp new file mode 100644 index 0000000..9661324 Binary files /dev/null and b/resource/ship-library/assets/portraits/456.webp differ diff --git a/resource/ship-library/assets/portraits/457.webp b/resource/ship-library/assets/portraits/457.webp new file mode 100644 index 0000000..0c1b5bd Binary files /dev/null and b/resource/ship-library/assets/portraits/457.webp differ diff --git a/resource/ship-library/assets/portraits/458.webp b/resource/ship-library/assets/portraits/458.webp new file mode 100644 index 0000000..926a5e6 Binary files /dev/null and b/resource/ship-library/assets/portraits/458.webp differ diff --git a/resource/ship-library/assets/portraits/459.webp b/resource/ship-library/assets/portraits/459.webp new file mode 100644 index 0000000..fd37d53 Binary files /dev/null and b/resource/ship-library/assets/portraits/459.webp differ diff --git a/resource/ship-library/assets/portraits/46.webp b/resource/ship-library/assets/portraits/46.webp new file mode 100644 index 0000000..83a3eb7 Binary files /dev/null and b/resource/ship-library/assets/portraits/46.webp differ diff --git a/resource/ship-library/assets/portraits/460.webp b/resource/ship-library/assets/portraits/460.webp new file mode 100644 index 0000000..6b9f211 Binary files /dev/null and b/resource/ship-library/assets/portraits/460.webp differ diff --git a/resource/ship-library/assets/portraits/461.webp b/resource/ship-library/assets/portraits/461.webp new file mode 100644 index 0000000..fe26c34 Binary files /dev/null and b/resource/ship-library/assets/portraits/461.webp differ diff --git a/resource/ship-library/assets/portraits/462.webp b/resource/ship-library/assets/portraits/462.webp new file mode 100644 index 0000000..4734262 Binary files /dev/null and b/resource/ship-library/assets/portraits/462.webp differ diff --git a/resource/ship-library/assets/portraits/463.webp b/resource/ship-library/assets/portraits/463.webp new file mode 100644 index 0000000..a432d64 Binary files /dev/null and b/resource/ship-library/assets/portraits/463.webp differ diff --git a/resource/ship-library/assets/portraits/464.webp b/resource/ship-library/assets/portraits/464.webp new file mode 100644 index 0000000..7f28269 Binary files /dev/null and b/resource/ship-library/assets/portraits/464.webp differ diff --git a/resource/ship-library/assets/portraits/465.webp b/resource/ship-library/assets/portraits/465.webp new file mode 100644 index 0000000..48bb5c6 Binary files /dev/null and b/resource/ship-library/assets/portraits/465.webp differ diff --git a/resource/ship-library/assets/portraits/466.webp b/resource/ship-library/assets/portraits/466.webp new file mode 100644 index 0000000..d953728 Binary files /dev/null and b/resource/ship-library/assets/portraits/466.webp differ diff --git a/resource/ship-library/assets/portraits/467.webp b/resource/ship-library/assets/portraits/467.webp new file mode 100644 index 0000000..8a43ca3 Binary files /dev/null and b/resource/ship-library/assets/portraits/467.webp differ diff --git a/resource/ship-library/assets/portraits/468.webp b/resource/ship-library/assets/portraits/468.webp new file mode 100644 index 0000000..f007ed5 Binary files /dev/null and b/resource/ship-library/assets/portraits/468.webp differ diff --git a/resource/ship-library/assets/portraits/469.webp b/resource/ship-library/assets/portraits/469.webp new file mode 100644 index 0000000..bdc7cba Binary files /dev/null and b/resource/ship-library/assets/portraits/469.webp differ diff --git a/resource/ship-library/assets/portraits/47.webp b/resource/ship-library/assets/portraits/47.webp new file mode 100644 index 0000000..e252c22 Binary files /dev/null and b/resource/ship-library/assets/portraits/47.webp differ diff --git a/resource/ship-library/assets/portraits/470.webp b/resource/ship-library/assets/portraits/470.webp new file mode 100644 index 0000000..903e8dc Binary files /dev/null and b/resource/ship-library/assets/portraits/470.webp differ diff --git a/resource/ship-library/assets/portraits/471.webp b/resource/ship-library/assets/portraits/471.webp new file mode 100644 index 0000000..51fc030 Binary files /dev/null and b/resource/ship-library/assets/portraits/471.webp differ diff --git a/resource/ship-library/assets/portraits/472.webp b/resource/ship-library/assets/portraits/472.webp new file mode 100644 index 0000000..5c1553d Binary files /dev/null and b/resource/ship-library/assets/portraits/472.webp differ diff --git a/resource/ship-library/assets/portraits/473.webp b/resource/ship-library/assets/portraits/473.webp new file mode 100644 index 0000000..ae9c4b0 Binary files /dev/null and b/resource/ship-library/assets/portraits/473.webp differ diff --git a/resource/ship-library/assets/portraits/474.webp b/resource/ship-library/assets/portraits/474.webp new file mode 100644 index 0000000..4c7d109 Binary files /dev/null and b/resource/ship-library/assets/portraits/474.webp differ diff --git a/resource/ship-library/assets/portraits/475.webp b/resource/ship-library/assets/portraits/475.webp new file mode 100644 index 0000000..8beb7fa Binary files /dev/null and b/resource/ship-library/assets/portraits/475.webp differ diff --git a/resource/ship-library/assets/portraits/476.webp b/resource/ship-library/assets/portraits/476.webp new file mode 100644 index 0000000..c53c8a6 Binary files /dev/null and b/resource/ship-library/assets/portraits/476.webp differ diff --git a/resource/ship-library/assets/portraits/477.webp b/resource/ship-library/assets/portraits/477.webp new file mode 100644 index 0000000..69ce212 Binary files /dev/null and b/resource/ship-library/assets/portraits/477.webp differ diff --git a/resource/ship-library/assets/portraits/478.webp b/resource/ship-library/assets/portraits/478.webp new file mode 100644 index 0000000..449aadd Binary files /dev/null and b/resource/ship-library/assets/portraits/478.webp differ diff --git a/resource/ship-library/assets/portraits/479.webp b/resource/ship-library/assets/portraits/479.webp new file mode 100644 index 0000000..5c1907b Binary files /dev/null and b/resource/ship-library/assets/portraits/479.webp differ diff --git a/resource/ship-library/assets/portraits/48.webp b/resource/ship-library/assets/portraits/48.webp new file mode 100644 index 0000000..d7acb9f Binary files /dev/null and b/resource/ship-library/assets/portraits/48.webp differ diff --git a/resource/ship-library/assets/portraits/480.webp b/resource/ship-library/assets/portraits/480.webp new file mode 100644 index 0000000..a0e71be Binary files /dev/null and b/resource/ship-library/assets/portraits/480.webp differ diff --git a/resource/ship-library/assets/portraits/481.webp b/resource/ship-library/assets/portraits/481.webp new file mode 100644 index 0000000..6ba3d02 Binary files /dev/null and b/resource/ship-library/assets/portraits/481.webp differ diff --git a/resource/ship-library/assets/portraits/482.webp b/resource/ship-library/assets/portraits/482.webp new file mode 100644 index 0000000..1123c3f Binary files /dev/null and b/resource/ship-library/assets/portraits/482.webp differ diff --git a/resource/ship-library/assets/portraits/483.webp b/resource/ship-library/assets/portraits/483.webp new file mode 100644 index 0000000..56b554b Binary files /dev/null and b/resource/ship-library/assets/portraits/483.webp differ diff --git a/resource/ship-library/assets/portraits/484.webp b/resource/ship-library/assets/portraits/484.webp new file mode 100644 index 0000000..962e196 Binary files /dev/null and b/resource/ship-library/assets/portraits/484.webp differ diff --git a/resource/ship-library/assets/portraits/485.webp b/resource/ship-library/assets/portraits/485.webp new file mode 100644 index 0000000..0c4f103 Binary files /dev/null and b/resource/ship-library/assets/portraits/485.webp differ diff --git a/resource/ship-library/assets/portraits/486.webp b/resource/ship-library/assets/portraits/486.webp new file mode 100644 index 0000000..defde16 Binary files /dev/null and b/resource/ship-library/assets/portraits/486.webp differ diff --git a/resource/ship-library/assets/portraits/487.webp b/resource/ship-library/assets/portraits/487.webp new file mode 100644 index 0000000..a8b542c Binary files /dev/null and b/resource/ship-library/assets/portraits/487.webp differ diff --git a/resource/ship-library/assets/portraits/488.webp b/resource/ship-library/assets/portraits/488.webp new file mode 100644 index 0000000..bca44a3 Binary files /dev/null and b/resource/ship-library/assets/portraits/488.webp differ diff --git a/resource/ship-library/assets/portraits/489.webp b/resource/ship-library/assets/portraits/489.webp new file mode 100644 index 0000000..8057125 Binary files /dev/null and b/resource/ship-library/assets/portraits/489.webp differ diff --git a/resource/ship-library/assets/portraits/49.webp b/resource/ship-library/assets/portraits/49.webp new file mode 100644 index 0000000..8a17eac Binary files /dev/null and b/resource/ship-library/assets/portraits/49.webp differ diff --git a/resource/ship-library/assets/portraits/490.webp b/resource/ship-library/assets/portraits/490.webp new file mode 100644 index 0000000..c1f5c28 Binary files /dev/null and b/resource/ship-library/assets/portraits/490.webp differ diff --git a/resource/ship-library/assets/portraits/491.webp b/resource/ship-library/assets/portraits/491.webp new file mode 100644 index 0000000..fd02b5f Binary files /dev/null and b/resource/ship-library/assets/portraits/491.webp differ diff --git a/resource/ship-library/assets/portraits/492.webp b/resource/ship-library/assets/portraits/492.webp new file mode 100644 index 0000000..5a97ae0 Binary files /dev/null and b/resource/ship-library/assets/portraits/492.webp differ diff --git a/resource/ship-library/assets/portraits/493.webp b/resource/ship-library/assets/portraits/493.webp new file mode 100644 index 0000000..fa7539a Binary files /dev/null and b/resource/ship-library/assets/portraits/493.webp differ diff --git a/resource/ship-library/assets/portraits/494.webp b/resource/ship-library/assets/portraits/494.webp new file mode 100644 index 0000000..327210b Binary files /dev/null and b/resource/ship-library/assets/portraits/494.webp differ diff --git a/resource/ship-library/assets/portraits/495.webp b/resource/ship-library/assets/portraits/495.webp new file mode 100644 index 0000000..6e19693 Binary files /dev/null and b/resource/ship-library/assets/portraits/495.webp differ diff --git a/resource/ship-library/assets/portraits/496.webp b/resource/ship-library/assets/portraits/496.webp new file mode 100644 index 0000000..c6a5e6b Binary files /dev/null and b/resource/ship-library/assets/portraits/496.webp differ diff --git a/resource/ship-library/assets/portraits/497.webp b/resource/ship-library/assets/portraits/497.webp new file mode 100644 index 0000000..fba4e01 Binary files /dev/null and b/resource/ship-library/assets/portraits/497.webp differ diff --git a/resource/ship-library/assets/portraits/498.webp b/resource/ship-library/assets/portraits/498.webp new file mode 100644 index 0000000..ed286a5 Binary files /dev/null and b/resource/ship-library/assets/portraits/498.webp differ diff --git a/resource/ship-library/assets/portraits/499.webp b/resource/ship-library/assets/portraits/499.webp new file mode 100644 index 0000000..fb663db Binary files /dev/null and b/resource/ship-library/assets/portraits/499.webp differ diff --git a/resource/ship-library/assets/portraits/5.webp b/resource/ship-library/assets/portraits/5.webp new file mode 100644 index 0000000..3e63e36 Binary files /dev/null and b/resource/ship-library/assets/portraits/5.webp differ diff --git a/resource/ship-library/assets/portraits/50.webp b/resource/ship-library/assets/portraits/50.webp new file mode 100644 index 0000000..dc2a751 Binary files /dev/null and b/resource/ship-library/assets/portraits/50.webp differ diff --git a/resource/ship-library/assets/portraits/500.webp b/resource/ship-library/assets/portraits/500.webp new file mode 100644 index 0000000..4398381 Binary files /dev/null and b/resource/ship-library/assets/portraits/500.webp differ diff --git a/resource/ship-library/assets/portraits/501.webp b/resource/ship-library/assets/portraits/501.webp new file mode 100644 index 0000000..ec24cde Binary files /dev/null and b/resource/ship-library/assets/portraits/501.webp differ diff --git a/resource/ship-library/assets/portraits/502.webp b/resource/ship-library/assets/portraits/502.webp new file mode 100644 index 0000000..63bfde1 Binary files /dev/null and b/resource/ship-library/assets/portraits/502.webp differ diff --git a/resource/ship-library/assets/portraits/503.webp b/resource/ship-library/assets/portraits/503.webp new file mode 100644 index 0000000..19cd03f Binary files /dev/null and b/resource/ship-library/assets/portraits/503.webp differ diff --git a/resource/ship-library/assets/portraits/504.webp b/resource/ship-library/assets/portraits/504.webp new file mode 100644 index 0000000..02493c2 Binary files /dev/null and b/resource/ship-library/assets/portraits/504.webp differ diff --git a/resource/ship-library/assets/portraits/505.webp b/resource/ship-library/assets/portraits/505.webp new file mode 100644 index 0000000..e0a40bb Binary files /dev/null and b/resource/ship-library/assets/portraits/505.webp differ diff --git a/resource/ship-library/assets/portraits/506.webp b/resource/ship-library/assets/portraits/506.webp new file mode 100644 index 0000000..434928d Binary files /dev/null and b/resource/ship-library/assets/portraits/506.webp differ diff --git a/resource/ship-library/assets/portraits/507.webp b/resource/ship-library/assets/portraits/507.webp new file mode 100644 index 0000000..31e31e9 Binary files /dev/null and b/resource/ship-library/assets/portraits/507.webp differ diff --git a/resource/ship-library/assets/portraits/508.webp b/resource/ship-library/assets/portraits/508.webp new file mode 100644 index 0000000..5503644 Binary files /dev/null and b/resource/ship-library/assets/portraits/508.webp differ diff --git a/resource/ship-library/assets/portraits/509.webp b/resource/ship-library/assets/portraits/509.webp new file mode 100644 index 0000000..5240c45 Binary files /dev/null and b/resource/ship-library/assets/portraits/509.webp differ diff --git a/resource/ship-library/assets/portraits/51.webp b/resource/ship-library/assets/portraits/51.webp new file mode 100644 index 0000000..9577db3 Binary files /dev/null and b/resource/ship-library/assets/portraits/51.webp differ diff --git a/resource/ship-library/assets/portraits/510.webp b/resource/ship-library/assets/portraits/510.webp new file mode 100644 index 0000000..8443505 Binary files /dev/null and b/resource/ship-library/assets/portraits/510.webp differ diff --git a/resource/ship-library/assets/portraits/511.webp b/resource/ship-library/assets/portraits/511.webp new file mode 100644 index 0000000..fba87cb Binary files /dev/null and b/resource/ship-library/assets/portraits/511.webp differ diff --git a/resource/ship-library/assets/portraits/512.webp b/resource/ship-library/assets/portraits/512.webp new file mode 100644 index 0000000..a779671 Binary files /dev/null and b/resource/ship-library/assets/portraits/512.webp differ diff --git a/resource/ship-library/assets/portraits/513.webp b/resource/ship-library/assets/portraits/513.webp new file mode 100644 index 0000000..2ee7102 Binary files /dev/null and b/resource/ship-library/assets/portraits/513.webp differ diff --git a/resource/ship-library/assets/portraits/514.webp b/resource/ship-library/assets/portraits/514.webp new file mode 100644 index 0000000..2d56de8 Binary files /dev/null and b/resource/ship-library/assets/portraits/514.webp differ diff --git a/resource/ship-library/assets/portraits/515.webp b/resource/ship-library/assets/portraits/515.webp new file mode 100644 index 0000000..891b3b6 Binary files /dev/null and b/resource/ship-library/assets/portraits/515.webp differ diff --git a/resource/ship-library/assets/portraits/516.webp b/resource/ship-library/assets/portraits/516.webp new file mode 100644 index 0000000..5a90b0f Binary files /dev/null and b/resource/ship-library/assets/portraits/516.webp differ diff --git a/resource/ship-library/assets/portraits/517.webp b/resource/ship-library/assets/portraits/517.webp new file mode 100644 index 0000000..ec3cdeb Binary files /dev/null and b/resource/ship-library/assets/portraits/517.webp differ diff --git a/resource/ship-library/assets/portraits/518.webp b/resource/ship-library/assets/portraits/518.webp new file mode 100644 index 0000000..8d2c1a9 Binary files /dev/null and b/resource/ship-library/assets/portraits/518.webp differ diff --git a/resource/ship-library/assets/portraits/519.webp b/resource/ship-library/assets/portraits/519.webp new file mode 100644 index 0000000..adbdcfb Binary files /dev/null and b/resource/ship-library/assets/portraits/519.webp differ diff --git a/resource/ship-library/assets/portraits/52.webp b/resource/ship-library/assets/portraits/52.webp new file mode 100644 index 0000000..1e3b201 Binary files /dev/null and b/resource/ship-library/assets/portraits/52.webp differ diff --git a/resource/ship-library/assets/portraits/520.webp b/resource/ship-library/assets/portraits/520.webp new file mode 100644 index 0000000..439e3c9 Binary files /dev/null and b/resource/ship-library/assets/portraits/520.webp differ diff --git a/resource/ship-library/assets/portraits/521.webp b/resource/ship-library/assets/portraits/521.webp new file mode 100644 index 0000000..53a3914 Binary files /dev/null and b/resource/ship-library/assets/portraits/521.webp differ diff --git a/resource/ship-library/assets/portraits/522.webp b/resource/ship-library/assets/portraits/522.webp new file mode 100644 index 0000000..cd21069 Binary files /dev/null and b/resource/ship-library/assets/portraits/522.webp differ diff --git a/resource/ship-library/assets/portraits/523.webp b/resource/ship-library/assets/portraits/523.webp new file mode 100644 index 0000000..955cad2 Binary files /dev/null and b/resource/ship-library/assets/portraits/523.webp differ diff --git a/resource/ship-library/assets/portraits/524.webp b/resource/ship-library/assets/portraits/524.webp new file mode 100644 index 0000000..7314b58 Binary files /dev/null and b/resource/ship-library/assets/portraits/524.webp differ diff --git a/resource/ship-library/assets/portraits/525.webp b/resource/ship-library/assets/portraits/525.webp new file mode 100644 index 0000000..08e6798 Binary files /dev/null and b/resource/ship-library/assets/portraits/525.webp differ diff --git a/resource/ship-library/assets/portraits/526.webp b/resource/ship-library/assets/portraits/526.webp new file mode 100644 index 0000000..3593d2b Binary files /dev/null and b/resource/ship-library/assets/portraits/526.webp differ diff --git a/resource/ship-library/assets/portraits/527.webp b/resource/ship-library/assets/portraits/527.webp new file mode 100644 index 0000000..ce620d9 Binary files /dev/null and b/resource/ship-library/assets/portraits/527.webp differ diff --git a/resource/ship-library/assets/portraits/528.webp b/resource/ship-library/assets/portraits/528.webp new file mode 100644 index 0000000..b8441c9 Binary files /dev/null and b/resource/ship-library/assets/portraits/528.webp differ diff --git a/resource/ship-library/assets/portraits/529.webp b/resource/ship-library/assets/portraits/529.webp new file mode 100644 index 0000000..381c6c3 Binary files /dev/null and b/resource/ship-library/assets/portraits/529.webp differ diff --git a/resource/ship-library/assets/portraits/53.webp b/resource/ship-library/assets/portraits/53.webp new file mode 100644 index 0000000..e7e240d Binary files /dev/null and b/resource/ship-library/assets/portraits/53.webp differ diff --git a/resource/ship-library/assets/portraits/530.webp b/resource/ship-library/assets/portraits/530.webp new file mode 100644 index 0000000..3d1b28a Binary files /dev/null and b/resource/ship-library/assets/portraits/530.webp differ diff --git a/resource/ship-library/assets/portraits/531.webp b/resource/ship-library/assets/portraits/531.webp new file mode 100644 index 0000000..4287ef4 Binary files /dev/null and b/resource/ship-library/assets/portraits/531.webp differ diff --git a/resource/ship-library/assets/portraits/532.webp b/resource/ship-library/assets/portraits/532.webp new file mode 100644 index 0000000..b80e9cf Binary files /dev/null and b/resource/ship-library/assets/portraits/532.webp differ diff --git a/resource/ship-library/assets/portraits/533.webp b/resource/ship-library/assets/portraits/533.webp new file mode 100644 index 0000000..291a3fe Binary files /dev/null and b/resource/ship-library/assets/portraits/533.webp differ diff --git a/resource/ship-library/assets/portraits/534.webp b/resource/ship-library/assets/portraits/534.webp new file mode 100644 index 0000000..55f0d11 Binary files /dev/null and b/resource/ship-library/assets/portraits/534.webp differ diff --git a/resource/ship-library/assets/portraits/535.webp b/resource/ship-library/assets/portraits/535.webp new file mode 100644 index 0000000..46ba764 Binary files /dev/null and b/resource/ship-library/assets/portraits/535.webp differ diff --git a/resource/ship-library/assets/portraits/536.webp b/resource/ship-library/assets/portraits/536.webp new file mode 100644 index 0000000..4f9e891 Binary files /dev/null and b/resource/ship-library/assets/portraits/536.webp differ diff --git a/resource/ship-library/assets/portraits/537.webp b/resource/ship-library/assets/portraits/537.webp new file mode 100644 index 0000000..d4d6288 Binary files /dev/null and b/resource/ship-library/assets/portraits/537.webp differ diff --git a/resource/ship-library/assets/portraits/538.webp b/resource/ship-library/assets/portraits/538.webp new file mode 100644 index 0000000..8578d29 Binary files /dev/null and b/resource/ship-library/assets/portraits/538.webp differ diff --git a/resource/ship-library/assets/portraits/539.webp b/resource/ship-library/assets/portraits/539.webp new file mode 100644 index 0000000..6e1fdc0 Binary files /dev/null and b/resource/ship-library/assets/portraits/539.webp differ diff --git a/resource/ship-library/assets/portraits/54.webp b/resource/ship-library/assets/portraits/54.webp new file mode 100644 index 0000000..7f72ed3 Binary files /dev/null and b/resource/ship-library/assets/portraits/54.webp differ diff --git a/resource/ship-library/assets/portraits/540.webp b/resource/ship-library/assets/portraits/540.webp new file mode 100644 index 0000000..f16b067 Binary files /dev/null and b/resource/ship-library/assets/portraits/540.webp differ diff --git a/resource/ship-library/assets/portraits/541.webp b/resource/ship-library/assets/portraits/541.webp new file mode 100644 index 0000000..7a1757a Binary files /dev/null and b/resource/ship-library/assets/portraits/541.webp differ diff --git a/resource/ship-library/assets/portraits/542.webp b/resource/ship-library/assets/portraits/542.webp new file mode 100644 index 0000000..8b06037 Binary files /dev/null and b/resource/ship-library/assets/portraits/542.webp differ diff --git a/resource/ship-library/assets/portraits/543.webp b/resource/ship-library/assets/portraits/543.webp new file mode 100644 index 0000000..5a39182 Binary files /dev/null and b/resource/ship-library/assets/portraits/543.webp differ diff --git a/resource/ship-library/assets/portraits/544.webp b/resource/ship-library/assets/portraits/544.webp new file mode 100644 index 0000000..e1ecf08 Binary files /dev/null and b/resource/ship-library/assets/portraits/544.webp differ diff --git a/resource/ship-library/assets/portraits/545.webp b/resource/ship-library/assets/portraits/545.webp new file mode 100644 index 0000000..bfc06ac Binary files /dev/null and b/resource/ship-library/assets/portraits/545.webp differ diff --git a/resource/ship-library/assets/portraits/546.webp b/resource/ship-library/assets/portraits/546.webp new file mode 100644 index 0000000..9cf8447 Binary files /dev/null and b/resource/ship-library/assets/portraits/546.webp differ diff --git a/resource/ship-library/assets/portraits/547.webp b/resource/ship-library/assets/portraits/547.webp new file mode 100644 index 0000000..f695259 Binary files /dev/null and b/resource/ship-library/assets/portraits/547.webp differ diff --git a/resource/ship-library/assets/portraits/548.webp b/resource/ship-library/assets/portraits/548.webp new file mode 100644 index 0000000..bd9a288 Binary files /dev/null and b/resource/ship-library/assets/portraits/548.webp differ diff --git a/resource/ship-library/assets/portraits/549.webp b/resource/ship-library/assets/portraits/549.webp new file mode 100644 index 0000000..4041dee Binary files /dev/null and b/resource/ship-library/assets/portraits/549.webp differ diff --git a/resource/ship-library/assets/portraits/55.webp b/resource/ship-library/assets/portraits/55.webp new file mode 100644 index 0000000..c1e1e00 Binary files /dev/null and b/resource/ship-library/assets/portraits/55.webp differ diff --git a/resource/ship-library/assets/portraits/550.webp b/resource/ship-library/assets/portraits/550.webp new file mode 100644 index 0000000..b0bb6ba Binary files /dev/null and b/resource/ship-library/assets/portraits/550.webp differ diff --git a/resource/ship-library/assets/portraits/551.webp b/resource/ship-library/assets/portraits/551.webp new file mode 100644 index 0000000..d2bff43 Binary files /dev/null and b/resource/ship-library/assets/portraits/551.webp differ diff --git a/resource/ship-library/assets/portraits/552.webp b/resource/ship-library/assets/portraits/552.webp new file mode 100644 index 0000000..6bd3325 Binary files /dev/null and b/resource/ship-library/assets/portraits/552.webp differ diff --git a/resource/ship-library/assets/portraits/553.webp b/resource/ship-library/assets/portraits/553.webp new file mode 100644 index 0000000..0b008a9 Binary files /dev/null and b/resource/ship-library/assets/portraits/553.webp differ diff --git a/resource/ship-library/assets/portraits/554.webp b/resource/ship-library/assets/portraits/554.webp new file mode 100644 index 0000000..a3acf27 Binary files /dev/null and b/resource/ship-library/assets/portraits/554.webp differ diff --git a/resource/ship-library/assets/portraits/555.webp b/resource/ship-library/assets/portraits/555.webp new file mode 100644 index 0000000..48a5f14 Binary files /dev/null and b/resource/ship-library/assets/portraits/555.webp differ diff --git a/resource/ship-library/assets/portraits/556.webp b/resource/ship-library/assets/portraits/556.webp new file mode 100644 index 0000000..28a7527 Binary files /dev/null and b/resource/ship-library/assets/portraits/556.webp differ diff --git a/resource/ship-library/assets/portraits/557.webp b/resource/ship-library/assets/portraits/557.webp new file mode 100644 index 0000000..03bf7f8 Binary files /dev/null and b/resource/ship-library/assets/portraits/557.webp differ diff --git a/resource/ship-library/assets/portraits/558.webp b/resource/ship-library/assets/portraits/558.webp new file mode 100644 index 0000000..3b861f7 Binary files /dev/null and b/resource/ship-library/assets/portraits/558.webp differ diff --git a/resource/ship-library/assets/portraits/559.webp b/resource/ship-library/assets/portraits/559.webp new file mode 100644 index 0000000..ac091e5 Binary files /dev/null and b/resource/ship-library/assets/portraits/559.webp differ diff --git a/resource/ship-library/assets/portraits/56.webp b/resource/ship-library/assets/portraits/56.webp new file mode 100644 index 0000000..88f616d Binary files /dev/null and b/resource/ship-library/assets/portraits/56.webp differ diff --git a/resource/ship-library/assets/portraits/560.webp b/resource/ship-library/assets/portraits/560.webp new file mode 100644 index 0000000..e8f1c3d Binary files /dev/null and b/resource/ship-library/assets/portraits/560.webp differ diff --git a/resource/ship-library/assets/portraits/561.webp b/resource/ship-library/assets/portraits/561.webp new file mode 100644 index 0000000..edb3532 Binary files /dev/null and b/resource/ship-library/assets/portraits/561.webp differ diff --git a/resource/ship-library/assets/portraits/562.webp b/resource/ship-library/assets/portraits/562.webp new file mode 100644 index 0000000..edc648f Binary files /dev/null and b/resource/ship-library/assets/portraits/562.webp differ diff --git a/resource/ship-library/assets/portraits/563.webp b/resource/ship-library/assets/portraits/563.webp new file mode 100644 index 0000000..cf25708 Binary files /dev/null and b/resource/ship-library/assets/portraits/563.webp differ diff --git a/resource/ship-library/assets/portraits/564.webp b/resource/ship-library/assets/portraits/564.webp new file mode 100644 index 0000000..49307a8 Binary files /dev/null and b/resource/ship-library/assets/portraits/564.webp differ diff --git a/resource/ship-library/assets/portraits/565.webp b/resource/ship-library/assets/portraits/565.webp new file mode 100644 index 0000000..db5a383 Binary files /dev/null and b/resource/ship-library/assets/portraits/565.webp differ diff --git a/resource/ship-library/assets/portraits/566.webp b/resource/ship-library/assets/portraits/566.webp new file mode 100644 index 0000000..ffd4ed5 Binary files /dev/null and b/resource/ship-library/assets/portraits/566.webp differ diff --git a/resource/ship-library/assets/portraits/567.webp b/resource/ship-library/assets/portraits/567.webp new file mode 100644 index 0000000..e79efa0 Binary files /dev/null and b/resource/ship-library/assets/portraits/567.webp differ diff --git a/resource/ship-library/assets/portraits/568.webp b/resource/ship-library/assets/portraits/568.webp new file mode 100644 index 0000000..1585b97 Binary files /dev/null and b/resource/ship-library/assets/portraits/568.webp differ diff --git a/resource/ship-library/assets/portraits/569.webp b/resource/ship-library/assets/portraits/569.webp new file mode 100644 index 0000000..e0dd5a4 Binary files /dev/null and b/resource/ship-library/assets/portraits/569.webp differ diff --git a/resource/ship-library/assets/portraits/57.webp b/resource/ship-library/assets/portraits/57.webp new file mode 100644 index 0000000..1f44f2a Binary files /dev/null and b/resource/ship-library/assets/portraits/57.webp differ diff --git a/resource/ship-library/assets/portraits/570.webp b/resource/ship-library/assets/portraits/570.webp new file mode 100644 index 0000000..49e2e5c Binary files /dev/null and b/resource/ship-library/assets/portraits/570.webp differ diff --git a/resource/ship-library/assets/portraits/571.webp b/resource/ship-library/assets/portraits/571.webp new file mode 100644 index 0000000..c6bf7e3 Binary files /dev/null and b/resource/ship-library/assets/portraits/571.webp differ diff --git a/resource/ship-library/assets/portraits/572.webp b/resource/ship-library/assets/portraits/572.webp new file mode 100644 index 0000000..a419e26 Binary files /dev/null and b/resource/ship-library/assets/portraits/572.webp differ diff --git a/resource/ship-library/assets/portraits/573.webp b/resource/ship-library/assets/portraits/573.webp new file mode 100644 index 0000000..babd412 Binary files /dev/null and b/resource/ship-library/assets/portraits/573.webp differ diff --git a/resource/ship-library/assets/portraits/574.webp b/resource/ship-library/assets/portraits/574.webp new file mode 100644 index 0000000..998b9ec Binary files /dev/null and b/resource/ship-library/assets/portraits/574.webp differ diff --git a/resource/ship-library/assets/portraits/575.webp b/resource/ship-library/assets/portraits/575.webp new file mode 100644 index 0000000..4c5b771 Binary files /dev/null and b/resource/ship-library/assets/portraits/575.webp differ diff --git a/resource/ship-library/assets/portraits/576.webp b/resource/ship-library/assets/portraits/576.webp new file mode 100644 index 0000000..1798e70 Binary files /dev/null and b/resource/ship-library/assets/portraits/576.webp differ diff --git a/resource/ship-library/assets/portraits/577.webp b/resource/ship-library/assets/portraits/577.webp new file mode 100644 index 0000000..733f5fd Binary files /dev/null and b/resource/ship-library/assets/portraits/577.webp differ diff --git a/resource/ship-library/assets/portraits/578.webp b/resource/ship-library/assets/portraits/578.webp new file mode 100644 index 0000000..0dda6a7 Binary files /dev/null and b/resource/ship-library/assets/portraits/578.webp differ diff --git a/resource/ship-library/assets/portraits/579.webp b/resource/ship-library/assets/portraits/579.webp new file mode 100644 index 0000000..8f247fa Binary files /dev/null and b/resource/ship-library/assets/portraits/579.webp differ diff --git a/resource/ship-library/assets/portraits/58.webp b/resource/ship-library/assets/portraits/58.webp new file mode 100644 index 0000000..ebf725e Binary files /dev/null and b/resource/ship-library/assets/portraits/58.webp differ diff --git a/resource/ship-library/assets/portraits/580.webp b/resource/ship-library/assets/portraits/580.webp new file mode 100644 index 0000000..0637faf Binary files /dev/null and b/resource/ship-library/assets/portraits/580.webp differ diff --git a/resource/ship-library/assets/portraits/581.webp b/resource/ship-library/assets/portraits/581.webp new file mode 100644 index 0000000..61653cc Binary files /dev/null and b/resource/ship-library/assets/portraits/581.webp differ diff --git a/resource/ship-library/assets/portraits/582.webp b/resource/ship-library/assets/portraits/582.webp new file mode 100644 index 0000000..d86d023 Binary files /dev/null and b/resource/ship-library/assets/portraits/582.webp differ diff --git a/resource/ship-library/assets/portraits/583.webp b/resource/ship-library/assets/portraits/583.webp new file mode 100644 index 0000000..10194c7 Binary files /dev/null and b/resource/ship-library/assets/portraits/583.webp differ diff --git a/resource/ship-library/assets/portraits/584.webp b/resource/ship-library/assets/portraits/584.webp new file mode 100644 index 0000000..833247c Binary files /dev/null and b/resource/ship-library/assets/portraits/584.webp differ diff --git a/resource/ship-library/assets/portraits/585.webp b/resource/ship-library/assets/portraits/585.webp new file mode 100644 index 0000000..e15a569 Binary files /dev/null and b/resource/ship-library/assets/portraits/585.webp differ diff --git a/resource/ship-library/assets/portraits/586.webp b/resource/ship-library/assets/portraits/586.webp new file mode 100644 index 0000000..db785a4 Binary files /dev/null and b/resource/ship-library/assets/portraits/586.webp differ diff --git a/resource/ship-library/assets/portraits/587.webp b/resource/ship-library/assets/portraits/587.webp new file mode 100644 index 0000000..81f683e Binary files /dev/null and b/resource/ship-library/assets/portraits/587.webp differ diff --git a/resource/ship-library/assets/portraits/588.webp b/resource/ship-library/assets/portraits/588.webp new file mode 100644 index 0000000..14b06b3 Binary files /dev/null and b/resource/ship-library/assets/portraits/588.webp differ diff --git a/resource/ship-library/assets/portraits/589.webp b/resource/ship-library/assets/portraits/589.webp new file mode 100644 index 0000000..66f9d7a Binary files /dev/null and b/resource/ship-library/assets/portraits/589.webp differ diff --git a/resource/ship-library/assets/portraits/59.webp b/resource/ship-library/assets/portraits/59.webp new file mode 100644 index 0000000..ab431f8 Binary files /dev/null and b/resource/ship-library/assets/portraits/59.webp differ diff --git a/resource/ship-library/assets/portraits/590.webp b/resource/ship-library/assets/portraits/590.webp new file mode 100644 index 0000000..fba1895 Binary files /dev/null and b/resource/ship-library/assets/portraits/590.webp differ diff --git a/resource/ship-library/assets/portraits/591.webp b/resource/ship-library/assets/portraits/591.webp new file mode 100644 index 0000000..7c1181e Binary files /dev/null and b/resource/ship-library/assets/portraits/591.webp differ diff --git a/resource/ship-library/assets/portraits/592.webp b/resource/ship-library/assets/portraits/592.webp new file mode 100644 index 0000000..537c03e Binary files /dev/null and b/resource/ship-library/assets/portraits/592.webp differ diff --git a/resource/ship-library/assets/portraits/593.webp b/resource/ship-library/assets/portraits/593.webp new file mode 100644 index 0000000..5e5f9cd Binary files /dev/null and b/resource/ship-library/assets/portraits/593.webp differ diff --git a/resource/ship-library/assets/portraits/594.webp b/resource/ship-library/assets/portraits/594.webp new file mode 100644 index 0000000..6084c45 Binary files /dev/null and b/resource/ship-library/assets/portraits/594.webp differ diff --git a/resource/ship-library/assets/portraits/595.webp b/resource/ship-library/assets/portraits/595.webp new file mode 100644 index 0000000..369ac0a Binary files /dev/null and b/resource/ship-library/assets/portraits/595.webp differ diff --git a/resource/ship-library/assets/portraits/596.webp b/resource/ship-library/assets/portraits/596.webp new file mode 100644 index 0000000..108177e Binary files /dev/null and b/resource/ship-library/assets/portraits/596.webp differ diff --git a/resource/ship-library/assets/portraits/597.webp b/resource/ship-library/assets/portraits/597.webp new file mode 100644 index 0000000..a08ec35 Binary files /dev/null and b/resource/ship-library/assets/portraits/597.webp differ diff --git a/resource/ship-library/assets/portraits/598.webp b/resource/ship-library/assets/portraits/598.webp new file mode 100644 index 0000000..f3c0550 Binary files /dev/null and b/resource/ship-library/assets/portraits/598.webp differ diff --git a/resource/ship-library/assets/portraits/599.webp b/resource/ship-library/assets/portraits/599.webp new file mode 100644 index 0000000..e2af089 Binary files /dev/null and b/resource/ship-library/assets/portraits/599.webp differ diff --git a/resource/ship-library/assets/portraits/6.webp b/resource/ship-library/assets/portraits/6.webp new file mode 100644 index 0000000..e7d8a32 Binary files /dev/null and b/resource/ship-library/assets/portraits/6.webp differ diff --git a/resource/ship-library/assets/portraits/60.webp b/resource/ship-library/assets/portraits/60.webp new file mode 100644 index 0000000..212c3e8 Binary files /dev/null and b/resource/ship-library/assets/portraits/60.webp differ diff --git a/resource/ship-library/assets/portraits/600.webp b/resource/ship-library/assets/portraits/600.webp new file mode 100644 index 0000000..f4f651f Binary files /dev/null and b/resource/ship-library/assets/portraits/600.webp differ diff --git a/resource/ship-library/assets/portraits/601.webp b/resource/ship-library/assets/portraits/601.webp new file mode 100644 index 0000000..af0f610 Binary files /dev/null and b/resource/ship-library/assets/portraits/601.webp differ diff --git a/resource/ship-library/assets/portraits/602.webp b/resource/ship-library/assets/portraits/602.webp new file mode 100644 index 0000000..1e85476 Binary files /dev/null and b/resource/ship-library/assets/portraits/602.webp differ diff --git a/resource/ship-library/assets/portraits/603.webp b/resource/ship-library/assets/portraits/603.webp new file mode 100644 index 0000000..675331c Binary files /dev/null and b/resource/ship-library/assets/portraits/603.webp differ diff --git a/resource/ship-library/assets/portraits/604.webp b/resource/ship-library/assets/portraits/604.webp new file mode 100644 index 0000000..2973005 Binary files /dev/null and b/resource/ship-library/assets/portraits/604.webp differ diff --git a/resource/ship-library/assets/portraits/605.webp b/resource/ship-library/assets/portraits/605.webp new file mode 100644 index 0000000..1ba135f Binary files /dev/null and b/resource/ship-library/assets/portraits/605.webp differ diff --git a/resource/ship-library/assets/portraits/606.webp b/resource/ship-library/assets/portraits/606.webp new file mode 100644 index 0000000..b4395c9 Binary files /dev/null and b/resource/ship-library/assets/portraits/606.webp differ diff --git a/resource/ship-library/assets/portraits/607.webp b/resource/ship-library/assets/portraits/607.webp new file mode 100644 index 0000000..f76a411 Binary files /dev/null and b/resource/ship-library/assets/portraits/607.webp differ diff --git a/resource/ship-library/assets/portraits/608.webp b/resource/ship-library/assets/portraits/608.webp new file mode 100644 index 0000000..d9ec650 Binary files /dev/null and b/resource/ship-library/assets/portraits/608.webp differ diff --git a/resource/ship-library/assets/portraits/609.webp b/resource/ship-library/assets/portraits/609.webp new file mode 100644 index 0000000..8f95a46 Binary files /dev/null and b/resource/ship-library/assets/portraits/609.webp differ diff --git a/resource/ship-library/assets/portraits/61.webp b/resource/ship-library/assets/portraits/61.webp new file mode 100644 index 0000000..8cfb101 Binary files /dev/null and b/resource/ship-library/assets/portraits/61.webp differ diff --git a/resource/ship-library/assets/portraits/610.webp b/resource/ship-library/assets/portraits/610.webp new file mode 100644 index 0000000..4863bd8 Binary files /dev/null and b/resource/ship-library/assets/portraits/610.webp differ diff --git a/resource/ship-library/assets/portraits/611.webp b/resource/ship-library/assets/portraits/611.webp new file mode 100644 index 0000000..36fcb98 Binary files /dev/null and b/resource/ship-library/assets/portraits/611.webp differ diff --git a/resource/ship-library/assets/portraits/612.webp b/resource/ship-library/assets/portraits/612.webp new file mode 100644 index 0000000..6ba5274 Binary files /dev/null and b/resource/ship-library/assets/portraits/612.webp differ diff --git a/resource/ship-library/assets/portraits/613.webp b/resource/ship-library/assets/portraits/613.webp new file mode 100644 index 0000000..ee7a43a Binary files /dev/null and b/resource/ship-library/assets/portraits/613.webp differ diff --git a/resource/ship-library/assets/portraits/614.webp b/resource/ship-library/assets/portraits/614.webp new file mode 100644 index 0000000..ce1f676 Binary files /dev/null and b/resource/ship-library/assets/portraits/614.webp differ diff --git a/resource/ship-library/assets/portraits/615.webp b/resource/ship-library/assets/portraits/615.webp new file mode 100644 index 0000000..373f974 Binary files /dev/null and b/resource/ship-library/assets/portraits/615.webp differ diff --git a/resource/ship-library/assets/portraits/616.webp b/resource/ship-library/assets/portraits/616.webp new file mode 100644 index 0000000..349d146 Binary files /dev/null and b/resource/ship-library/assets/portraits/616.webp differ diff --git a/resource/ship-library/assets/portraits/617.webp b/resource/ship-library/assets/portraits/617.webp new file mode 100644 index 0000000..afdff29 Binary files /dev/null and b/resource/ship-library/assets/portraits/617.webp differ diff --git a/resource/ship-library/assets/portraits/618.webp b/resource/ship-library/assets/portraits/618.webp new file mode 100644 index 0000000..729fbc8 Binary files /dev/null and b/resource/ship-library/assets/portraits/618.webp differ diff --git a/resource/ship-library/assets/portraits/619.webp b/resource/ship-library/assets/portraits/619.webp new file mode 100644 index 0000000..ff71029 Binary files /dev/null and b/resource/ship-library/assets/portraits/619.webp differ diff --git a/resource/ship-library/assets/portraits/62.webp b/resource/ship-library/assets/portraits/62.webp new file mode 100644 index 0000000..0f0b6b6 Binary files /dev/null and b/resource/ship-library/assets/portraits/62.webp differ diff --git a/resource/ship-library/assets/portraits/620.webp b/resource/ship-library/assets/portraits/620.webp new file mode 100644 index 0000000..c2db700 Binary files /dev/null and b/resource/ship-library/assets/portraits/620.webp differ diff --git a/resource/ship-library/assets/portraits/621.webp b/resource/ship-library/assets/portraits/621.webp new file mode 100644 index 0000000..e48cb49 Binary files /dev/null and b/resource/ship-library/assets/portraits/621.webp differ diff --git a/resource/ship-library/assets/portraits/622.webp b/resource/ship-library/assets/portraits/622.webp new file mode 100644 index 0000000..33a8319 Binary files /dev/null and b/resource/ship-library/assets/portraits/622.webp differ diff --git a/resource/ship-library/assets/portraits/623.webp b/resource/ship-library/assets/portraits/623.webp new file mode 100644 index 0000000..5f88ad5 Binary files /dev/null and b/resource/ship-library/assets/portraits/623.webp differ diff --git a/resource/ship-library/assets/portraits/624.webp b/resource/ship-library/assets/portraits/624.webp new file mode 100644 index 0000000..b32a122 Binary files /dev/null and b/resource/ship-library/assets/portraits/624.webp differ diff --git a/resource/ship-library/assets/portraits/625.webp b/resource/ship-library/assets/portraits/625.webp new file mode 100644 index 0000000..1e6d44f Binary files /dev/null and b/resource/ship-library/assets/portraits/625.webp differ diff --git a/resource/ship-library/assets/portraits/626.webp b/resource/ship-library/assets/portraits/626.webp new file mode 100644 index 0000000..2795235 Binary files /dev/null and b/resource/ship-library/assets/portraits/626.webp differ diff --git a/resource/ship-library/assets/portraits/627.webp b/resource/ship-library/assets/portraits/627.webp new file mode 100644 index 0000000..01ce17c Binary files /dev/null and b/resource/ship-library/assets/portraits/627.webp differ diff --git a/resource/ship-library/assets/portraits/628.webp b/resource/ship-library/assets/portraits/628.webp new file mode 100644 index 0000000..d345cc3 Binary files /dev/null and b/resource/ship-library/assets/portraits/628.webp differ diff --git a/resource/ship-library/assets/portraits/629.webp b/resource/ship-library/assets/portraits/629.webp new file mode 100644 index 0000000..abadede Binary files /dev/null and b/resource/ship-library/assets/portraits/629.webp differ diff --git a/resource/ship-library/assets/portraits/63.webp b/resource/ship-library/assets/portraits/63.webp new file mode 100644 index 0000000..982a807 Binary files /dev/null and b/resource/ship-library/assets/portraits/63.webp differ diff --git a/resource/ship-library/assets/portraits/630.webp b/resource/ship-library/assets/portraits/630.webp new file mode 100644 index 0000000..4db6c96 Binary files /dev/null and b/resource/ship-library/assets/portraits/630.webp differ diff --git a/resource/ship-library/assets/portraits/631.webp b/resource/ship-library/assets/portraits/631.webp new file mode 100644 index 0000000..58236d5 Binary files /dev/null and b/resource/ship-library/assets/portraits/631.webp differ diff --git a/resource/ship-library/assets/portraits/632.webp b/resource/ship-library/assets/portraits/632.webp new file mode 100644 index 0000000..56857fd Binary files /dev/null and b/resource/ship-library/assets/portraits/632.webp differ diff --git a/resource/ship-library/assets/portraits/633.webp b/resource/ship-library/assets/portraits/633.webp new file mode 100644 index 0000000..fc1ba41 Binary files /dev/null and b/resource/ship-library/assets/portraits/633.webp differ diff --git a/resource/ship-library/assets/portraits/634.webp b/resource/ship-library/assets/portraits/634.webp new file mode 100644 index 0000000..69519ab Binary files /dev/null and b/resource/ship-library/assets/portraits/634.webp differ diff --git a/resource/ship-library/assets/portraits/635.webp b/resource/ship-library/assets/portraits/635.webp new file mode 100644 index 0000000..0a90b22 Binary files /dev/null and b/resource/ship-library/assets/portraits/635.webp differ diff --git a/resource/ship-library/assets/portraits/636.webp b/resource/ship-library/assets/portraits/636.webp new file mode 100644 index 0000000..2262d8e Binary files /dev/null and b/resource/ship-library/assets/portraits/636.webp differ diff --git a/resource/ship-library/assets/portraits/637.webp b/resource/ship-library/assets/portraits/637.webp new file mode 100644 index 0000000..88fa09a Binary files /dev/null and b/resource/ship-library/assets/portraits/637.webp differ diff --git a/resource/ship-library/assets/portraits/638.webp b/resource/ship-library/assets/portraits/638.webp new file mode 100644 index 0000000..228bc15 Binary files /dev/null and b/resource/ship-library/assets/portraits/638.webp differ diff --git a/resource/ship-library/assets/portraits/639.webp b/resource/ship-library/assets/portraits/639.webp new file mode 100644 index 0000000..ae2dcd7 Binary files /dev/null and b/resource/ship-library/assets/portraits/639.webp differ diff --git a/resource/ship-library/assets/portraits/64.webp b/resource/ship-library/assets/portraits/64.webp new file mode 100644 index 0000000..7927372 Binary files /dev/null and b/resource/ship-library/assets/portraits/64.webp differ diff --git a/resource/ship-library/assets/portraits/640.webp b/resource/ship-library/assets/portraits/640.webp new file mode 100644 index 0000000..3143e55 Binary files /dev/null and b/resource/ship-library/assets/portraits/640.webp differ diff --git a/resource/ship-library/assets/portraits/641.webp b/resource/ship-library/assets/portraits/641.webp new file mode 100644 index 0000000..c561af4 Binary files /dev/null and b/resource/ship-library/assets/portraits/641.webp differ diff --git a/resource/ship-library/assets/portraits/642.webp b/resource/ship-library/assets/portraits/642.webp new file mode 100644 index 0000000..3ef1e9e Binary files /dev/null and b/resource/ship-library/assets/portraits/642.webp differ diff --git a/resource/ship-library/assets/portraits/643.webp b/resource/ship-library/assets/portraits/643.webp new file mode 100644 index 0000000..bff788f Binary files /dev/null and b/resource/ship-library/assets/portraits/643.webp differ diff --git a/resource/ship-library/assets/portraits/644.webp b/resource/ship-library/assets/portraits/644.webp new file mode 100644 index 0000000..8124691 Binary files /dev/null and b/resource/ship-library/assets/portraits/644.webp differ diff --git a/resource/ship-library/assets/portraits/645.webp b/resource/ship-library/assets/portraits/645.webp new file mode 100644 index 0000000..13a253c Binary files /dev/null and b/resource/ship-library/assets/portraits/645.webp differ diff --git a/resource/ship-library/assets/portraits/646.webp b/resource/ship-library/assets/portraits/646.webp new file mode 100644 index 0000000..74d48a0 Binary files /dev/null and b/resource/ship-library/assets/portraits/646.webp differ diff --git a/resource/ship-library/assets/portraits/647.webp b/resource/ship-library/assets/portraits/647.webp new file mode 100644 index 0000000..78a3e1f Binary files /dev/null and b/resource/ship-library/assets/portraits/647.webp differ diff --git a/resource/ship-library/assets/portraits/648.webp b/resource/ship-library/assets/portraits/648.webp new file mode 100644 index 0000000..4ddc425 Binary files /dev/null and b/resource/ship-library/assets/portraits/648.webp differ diff --git a/resource/ship-library/assets/portraits/649.webp b/resource/ship-library/assets/portraits/649.webp new file mode 100644 index 0000000..b1b1ebc Binary files /dev/null and b/resource/ship-library/assets/portraits/649.webp differ diff --git a/resource/ship-library/assets/portraits/65.webp b/resource/ship-library/assets/portraits/65.webp new file mode 100644 index 0000000..f0c3a8e Binary files /dev/null and b/resource/ship-library/assets/portraits/65.webp differ diff --git a/resource/ship-library/assets/portraits/650.webp b/resource/ship-library/assets/portraits/650.webp new file mode 100644 index 0000000..6d17028 Binary files /dev/null and b/resource/ship-library/assets/portraits/650.webp differ diff --git a/resource/ship-library/assets/portraits/651.webp b/resource/ship-library/assets/portraits/651.webp new file mode 100644 index 0000000..9969e36 Binary files /dev/null and b/resource/ship-library/assets/portraits/651.webp differ diff --git a/resource/ship-library/assets/portraits/66.webp b/resource/ship-library/assets/portraits/66.webp new file mode 100644 index 0000000..548cea0 Binary files /dev/null and b/resource/ship-library/assets/portraits/66.webp differ diff --git a/resource/ship-library/assets/portraits/67.webp b/resource/ship-library/assets/portraits/67.webp new file mode 100644 index 0000000..6b9c75a Binary files /dev/null and b/resource/ship-library/assets/portraits/67.webp differ diff --git a/resource/ship-library/assets/portraits/68.webp b/resource/ship-library/assets/portraits/68.webp new file mode 100644 index 0000000..70f59f9 Binary files /dev/null and b/resource/ship-library/assets/portraits/68.webp differ diff --git a/resource/ship-library/assets/portraits/69.webp b/resource/ship-library/assets/portraits/69.webp new file mode 100644 index 0000000..f4ba13a Binary files /dev/null and b/resource/ship-library/assets/portraits/69.webp differ diff --git a/resource/ship-library/assets/portraits/7.webp b/resource/ship-library/assets/portraits/7.webp new file mode 100644 index 0000000..1f64b9a Binary files /dev/null and b/resource/ship-library/assets/portraits/7.webp differ diff --git a/resource/ship-library/assets/portraits/70.webp b/resource/ship-library/assets/portraits/70.webp new file mode 100644 index 0000000..52bf287 Binary files /dev/null and b/resource/ship-library/assets/portraits/70.webp differ diff --git a/resource/ship-library/assets/portraits/71.webp b/resource/ship-library/assets/portraits/71.webp new file mode 100644 index 0000000..963d64d Binary files /dev/null and b/resource/ship-library/assets/portraits/71.webp differ diff --git a/resource/ship-library/assets/portraits/72.webp b/resource/ship-library/assets/portraits/72.webp new file mode 100644 index 0000000..a94ba55 Binary files /dev/null and b/resource/ship-library/assets/portraits/72.webp differ diff --git a/resource/ship-library/assets/portraits/73.webp b/resource/ship-library/assets/portraits/73.webp new file mode 100644 index 0000000..8ad4aec Binary files /dev/null and b/resource/ship-library/assets/portraits/73.webp differ diff --git a/resource/ship-library/assets/portraits/74.webp b/resource/ship-library/assets/portraits/74.webp new file mode 100644 index 0000000..c38ccf4 Binary files /dev/null and b/resource/ship-library/assets/portraits/74.webp differ diff --git a/resource/ship-library/assets/portraits/75.webp b/resource/ship-library/assets/portraits/75.webp new file mode 100644 index 0000000..3099e01 Binary files /dev/null and b/resource/ship-library/assets/portraits/75.webp differ diff --git a/resource/ship-library/assets/portraits/76.webp b/resource/ship-library/assets/portraits/76.webp new file mode 100644 index 0000000..447bd5a Binary files /dev/null and b/resource/ship-library/assets/portraits/76.webp differ diff --git a/resource/ship-library/assets/portraits/77.webp b/resource/ship-library/assets/portraits/77.webp new file mode 100644 index 0000000..d0e28d9 Binary files /dev/null and b/resource/ship-library/assets/portraits/77.webp differ diff --git a/resource/ship-library/assets/portraits/78.webp b/resource/ship-library/assets/portraits/78.webp new file mode 100644 index 0000000..26b0e79 Binary files /dev/null and b/resource/ship-library/assets/portraits/78.webp differ diff --git a/resource/ship-library/assets/portraits/79.webp b/resource/ship-library/assets/portraits/79.webp new file mode 100644 index 0000000..dfd9143 Binary files /dev/null and b/resource/ship-library/assets/portraits/79.webp differ diff --git a/resource/ship-library/assets/portraits/8.webp b/resource/ship-library/assets/portraits/8.webp new file mode 100644 index 0000000..3a74848 Binary files /dev/null and b/resource/ship-library/assets/portraits/8.webp differ diff --git a/resource/ship-library/assets/portraits/80.webp b/resource/ship-library/assets/portraits/80.webp new file mode 100644 index 0000000..e5bb7eb Binary files /dev/null and b/resource/ship-library/assets/portraits/80.webp differ diff --git a/resource/ship-library/assets/portraits/8007.webp b/resource/ship-library/assets/portraits/8007.webp new file mode 100644 index 0000000..11410d0 Binary files /dev/null and b/resource/ship-library/assets/portraits/8007.webp differ diff --git a/resource/ship-library/assets/portraits/8009.webp b/resource/ship-library/assets/portraits/8009.webp new file mode 100644 index 0000000..305a9e6 Binary files /dev/null and b/resource/ship-library/assets/portraits/8009.webp differ diff --git a/resource/ship-library/assets/portraits/81.webp b/resource/ship-library/assets/portraits/81.webp new file mode 100644 index 0000000..d3ed27a Binary files /dev/null and b/resource/ship-library/assets/portraits/81.webp differ diff --git a/resource/ship-library/assets/portraits/8111.webp b/resource/ship-library/assets/portraits/8111.webp new file mode 100644 index 0000000..c27e521 Binary files /dev/null and b/resource/ship-library/assets/portraits/8111.webp differ diff --git a/resource/ship-library/assets/portraits/8116.webp b/resource/ship-library/assets/portraits/8116.webp new file mode 100644 index 0000000..cce2f3c Binary files /dev/null and b/resource/ship-library/assets/portraits/8116.webp differ diff --git a/resource/ship-library/assets/portraits/82.webp b/resource/ship-library/assets/portraits/82.webp new file mode 100644 index 0000000..dc312f8 Binary files /dev/null and b/resource/ship-library/assets/portraits/82.webp differ diff --git a/resource/ship-library/assets/portraits/83.webp b/resource/ship-library/assets/portraits/83.webp new file mode 100644 index 0000000..2522243 Binary files /dev/null and b/resource/ship-library/assets/portraits/83.webp differ diff --git a/resource/ship-library/assets/portraits/84.webp b/resource/ship-library/assets/portraits/84.webp new file mode 100644 index 0000000..eadaa6d Binary files /dev/null and b/resource/ship-library/assets/portraits/84.webp differ diff --git a/resource/ship-library/assets/portraits/85.webp b/resource/ship-library/assets/portraits/85.webp new file mode 100644 index 0000000..bfb7f0f Binary files /dev/null and b/resource/ship-library/assets/portraits/85.webp differ diff --git a/resource/ship-library/assets/portraits/86.webp b/resource/ship-library/assets/portraits/86.webp new file mode 100644 index 0000000..51c23f3 Binary files /dev/null and b/resource/ship-library/assets/portraits/86.webp differ diff --git a/resource/ship-library/assets/portraits/87.webp b/resource/ship-library/assets/portraits/87.webp new file mode 100644 index 0000000..b345d07 Binary files /dev/null and b/resource/ship-library/assets/portraits/87.webp differ diff --git a/resource/ship-library/assets/portraits/88.webp b/resource/ship-library/assets/portraits/88.webp new file mode 100644 index 0000000..787ddc0 Binary files /dev/null and b/resource/ship-library/assets/portraits/88.webp differ diff --git a/resource/ship-library/assets/portraits/89.webp b/resource/ship-library/assets/portraits/89.webp new file mode 100644 index 0000000..bf44a77 Binary files /dev/null and b/resource/ship-library/assets/portraits/89.webp differ diff --git a/resource/ship-library/assets/portraits/9.webp b/resource/ship-library/assets/portraits/9.webp new file mode 100644 index 0000000..0fc2a45 Binary files /dev/null and b/resource/ship-library/assets/portraits/9.webp differ diff --git a/resource/ship-library/assets/portraits/90.webp b/resource/ship-library/assets/portraits/90.webp new file mode 100644 index 0000000..b853264 Binary files /dev/null and b/resource/ship-library/assets/portraits/90.webp differ diff --git a/resource/ship-library/assets/portraits/91.webp b/resource/ship-library/assets/portraits/91.webp new file mode 100644 index 0000000..6322915 Binary files /dev/null and b/resource/ship-library/assets/portraits/91.webp differ diff --git a/resource/ship-library/assets/portraits/92.webp b/resource/ship-library/assets/portraits/92.webp new file mode 100644 index 0000000..920e0a0 Binary files /dev/null and b/resource/ship-library/assets/portraits/92.webp differ diff --git a/resource/ship-library/assets/portraits/93.webp b/resource/ship-library/assets/portraits/93.webp new file mode 100644 index 0000000..df53c28 Binary files /dev/null and b/resource/ship-library/assets/portraits/93.webp differ diff --git a/resource/ship-library/assets/portraits/94.webp b/resource/ship-library/assets/portraits/94.webp new file mode 100644 index 0000000..c30312d Binary files /dev/null and b/resource/ship-library/assets/portraits/94.webp differ diff --git a/resource/ship-library/assets/portraits/95.webp b/resource/ship-library/assets/portraits/95.webp new file mode 100644 index 0000000..647a88c Binary files /dev/null and b/resource/ship-library/assets/portraits/95.webp differ diff --git a/resource/ship-library/assets/portraits/96.webp b/resource/ship-library/assets/portraits/96.webp new file mode 100644 index 0000000..304237d Binary files /dev/null and b/resource/ship-library/assets/portraits/96.webp differ diff --git a/resource/ship-library/assets/portraits/97.webp b/resource/ship-library/assets/portraits/97.webp new file mode 100644 index 0000000..9607e7e Binary files /dev/null and b/resource/ship-library/assets/portraits/97.webp differ diff --git a/resource/ship-library/assets/portraits/98.webp b/resource/ship-library/assets/portraits/98.webp new file mode 100644 index 0000000..71896be Binary files /dev/null and b/resource/ship-library/assets/portraits/98.webp differ diff --git a/resource/ship-library/assets/portraits/99.webp b/resource/ship-library/assets/portraits/99.webp new file mode 100644 index 0000000..279a8a3 Binary files /dev/null and b/resource/ship-library/assets/portraits/99.webp differ diff --git a/resource/ship-library/assets/type-icons/ap.webp b/resource/ship-library/assets/type-icons/ap.webp new file mode 100644 index 0000000..6e7f785 Binary files /dev/null and b/resource/ship-library/assets/type-icons/ap.webp differ diff --git a/resource/ship-library/assets/type-icons/av.webp b/resource/ship-library/assets/type-icons/av.webp new file mode 100644 index 0000000..86a710a Binary files /dev/null and b/resource/ship-library/assets/type-icons/av.webp differ diff --git a/resource/ship-library/assets/type-icons/bb.webp b/resource/ship-library/assets/type-icons/bb.webp new file mode 100644 index 0000000..81fd732 Binary files /dev/null and b/resource/ship-library/assets/type-icons/bb.webp differ diff --git a/resource/ship-library/assets/type-icons/bbg.webp b/resource/ship-library/assets/type-icons/bbg.webp new file mode 100644 index 0000000..f6d0442 Binary files /dev/null and b/resource/ship-library/assets/type-icons/bbg.webp differ diff --git a/resource/ship-library/assets/type-icons/bbv.webp b/resource/ship-library/assets/type-icons/bbv.webp new file mode 100644 index 0000000..02c51a4 Binary files /dev/null and b/resource/ship-library/assets/type-icons/bbv.webp differ diff --git a/resource/ship-library/assets/type-icons/bc.webp b/resource/ship-library/assets/type-icons/bc.webp new file mode 100644 index 0000000..6e6b903 Binary files /dev/null and b/resource/ship-library/assets/type-icons/bc.webp differ diff --git a/resource/ship-library/assets/type-icons/bm.webp b/resource/ship-library/assets/type-icons/bm.webp new file mode 100644 index 0000000..a721450 Binary files /dev/null and b/resource/ship-library/assets/type-icons/bm.webp differ diff --git a/resource/ship-library/assets/type-icons/ca.webp b/resource/ship-library/assets/type-icons/ca.webp new file mode 100644 index 0000000..ec5bc9a Binary files /dev/null and b/resource/ship-library/assets/type-icons/ca.webp differ diff --git a/resource/ship-library/assets/type-icons/cav.webp b/resource/ship-library/assets/type-icons/cav.webp new file mode 100644 index 0000000..9616554 Binary files /dev/null and b/resource/ship-library/assets/type-icons/cav.webp differ diff --git a/resource/ship-library/assets/type-icons/cbg.webp b/resource/ship-library/assets/type-icons/cbg.webp new file mode 100644 index 0000000..d05ea74 Binary files /dev/null and b/resource/ship-library/assets/type-icons/cbg.webp differ diff --git a/resource/ship-library/assets/type-icons/cf.webp b/resource/ship-library/assets/type-icons/cf.webp new file mode 100644 index 0000000..8e4390e Binary files /dev/null and b/resource/ship-library/assets/type-icons/cf.webp differ diff --git a/resource/ship-library/assets/type-icons/cg.webp b/resource/ship-library/assets/type-icons/cg.webp new file mode 100644 index 0000000..18a8f14 Binary files /dev/null and b/resource/ship-library/assets/type-icons/cg.webp differ diff --git a/resource/ship-library/assets/type-icons/cgaa.webp b/resource/ship-library/assets/type-icons/cgaa.webp new file mode 100644 index 0000000..b6623b5 Binary files /dev/null and b/resource/ship-library/assets/type-icons/cgaa.webp differ diff --git a/resource/ship-library/assets/type-icons/cl.webp b/resource/ship-library/assets/type-icons/cl.webp new file mode 100644 index 0000000..00c8bcd Binary files /dev/null and b/resource/ship-library/assets/type-icons/cl.webp differ diff --git a/resource/ship-library/assets/type-icons/clt.webp b/resource/ship-library/assets/type-icons/clt.webp new file mode 100644 index 0000000..c6b7e22 Binary files /dev/null and b/resource/ship-library/assets/type-icons/clt.webp differ diff --git a/resource/ship-library/assets/type-icons/cv.webp b/resource/ship-library/assets/type-icons/cv.webp new file mode 100644 index 0000000..14d38b6 Binary files /dev/null and b/resource/ship-library/assets/type-icons/cv.webp differ diff --git a/resource/ship-library/assets/type-icons/cvl.webp b/resource/ship-library/assets/type-icons/cvl.webp new file mode 100644 index 0000000..39f188b Binary files /dev/null and b/resource/ship-library/assets/type-icons/cvl.webp differ diff --git a/resource/ship-library/assets/type-icons/dd.webp b/resource/ship-library/assets/type-icons/dd.webp new file mode 100644 index 0000000..b165169 Binary files /dev/null and b/resource/ship-library/assets/type-icons/dd.webp differ diff --git a/resource/ship-library/assets/type-icons/ddg.webp b/resource/ship-library/assets/type-icons/ddg.webp new file mode 100644 index 0000000..0f2b01d Binary files /dev/null and b/resource/ship-library/assets/type-icons/ddg.webp differ diff --git a/resource/ship-library/assets/type-icons/ddgaa.webp b/resource/ship-library/assets/type-icons/ddgaa.webp new file mode 100644 index 0000000..0984320 Binary files /dev/null and b/resource/ship-library/assets/type-icons/ddgaa.webp differ diff --git a/resource/ship-library/assets/type-icons/sc.webp b/resource/ship-library/assets/type-icons/sc.webp new file mode 100644 index 0000000..7235f9b Binary files /dev/null and b/resource/ship-library/assets/type-icons/sc.webp differ diff --git a/resource/ship-library/assets/type-icons/ss.webp b/resource/ship-library/assets/type-icons/ss.webp new file mode 100644 index 0000000..fd5b3a5 Binary files /dev/null and b/resource/ship-library/assets/type-icons/ss.webp differ diff --git a/resource/ship-library/assets/type-icons/ssg.webp b/resource/ship-library/assets/type-icons/ssg.webp new file mode 100644 index 0000000..7434957 Binary files /dev/null and b/resource/ship-library/assets/type-icons/ssg.webp differ diff --git a/resource/ship-library/database/ships.sqlite3 b/resource/ship-library/database/ships.sqlite3 new file mode 100644 index 0000000..45070df Binary files /dev/null and b/resource/ship-library/database/ships.sqlite3 differ diff --git a/resource/ship-library/labels.zh-CN.json b/resource/ship-library/labels.zh-CN.json new file mode 100644 index 0000000..db8270e --- /dev/null +++ b/resource/ship-library/labels.zh-CN.json @@ -0,0 +1,53 @@ +{ + "locale": "zh-CN", + "ship_types": { + "ap": "补给舰", + "av": "装甲航空母舰", + "bb": "战列舰", + "bbg": "导弹战列舰", + "bbv": "航空战列舰", + "bc": "战列巡洋舰", + "bm": "浅水重炮舰", + "ca": "重巡洋舰", + "cav": "航空巡洋舰", + "cbg": "导弹大型巡洋舰", + "cf": "旗舰", + "cg": "反舰导弹巡洋舰", + "cgaa": "防空导弹巡洋舰", + "cl": "轻巡洋舰", + "clt": "重雷装巡洋舰", + "cv": "航空母舰", + "cvl": "轻型航空母舰", + "dd": "驱逐舰", + "ddg": "反舰导弹驱逐舰", + "ddgaa": "防空导弹驱逐舰", + "sc": "重炮潜艇", + "ss": "潜水艇", + "ssg": "导弹潜艇" + }, + "size_classes": { + "large": "大型舰", + "medium": "中型舰", + "small": "小型舰" + }, + "role_classes": { + "main_force": "主力舰", + "escort": "护卫舰" + }, + "countries": { + "china": "中国", + "france": "法国", + "germany": "德国", + "italy": "意大利", + "japan": "日本", + "other": "其他", + "soviet_union": "苏联", + "united_kingdom": "英国", + "united_states": "美国" + }, + "variants": { + "normal": "普通", + "refit": "改造", + "special": "特殊" + } +} diff --git a/resource/ship-library/manifest.json b/resource/ship-library/manifest.json new file mode 100644 index 0000000..40889e2 --- /dev/null +++ b/resource/ship-library/manifest.json @@ -0,0 +1,14436 @@ +{ + "schema_version": 2, + "generated_at": "2026-08-02T10:04:47+00:00", + "source": { + "wiki": "https://www.zjsnrwiki.com", + "index_url": "https://www.zjsnrwiki.com/wiki/%E8%88%B0%E5%A8%98%E5%9B%BE%E9%89%B4", + "database_revision": 122519, + "patch_revision": 121763 + }, + "counts": { + "ships": 894, + "assets": 929, + "missing_assets": 0 + }, + "labels": { + "locale": "zh-CN", + "ship_types": { + "ap": "补给舰", + "av": "装甲航空母舰", + "bb": "战列舰", + "bbg": "导弹战列舰", + "bbv": "航空战列舰", + "bc": "战列巡洋舰", + "bm": "浅水重炮舰", + "ca": "重巡洋舰", + "cav": "航空巡洋舰", + "cbg": "导弹大型巡洋舰", + "cf": "旗舰", + "cg": "反舰导弹巡洋舰", + "cgaa": "防空导弹巡洋舰", + "cl": "轻巡洋舰", + "clt": "重雷装巡洋舰", + "cv": "航空母舰", + "cvl": "轻型航空母舰", + "dd": "驱逐舰", + "ddg": "反舰导弹驱逐舰", + "ddgaa": "防空导弹驱逐舰", + "sc": "重炮潜艇", + "ss": "潜水艇", + "ssg": "导弹潜艇" + }, + "size_classes": { + "large": "大型舰", + "medium": "中型舰", + "small": "小型舰" + }, + "role_classes": { + "main_force": "主力舰", + "escort": "护卫舰" + }, + "countries": { + "china": "中国", + "france": "法国", + "germany": "德国", + "italy": "意大利", + "japan": "日本", + "other": "其他", + "soviet_union": "苏联", + "united_kingdom": "英国", + "united_states": "美国" + }, + "variants": { + "normal": "普通", + "refit": "改造", + "special": "特殊" + } + }, + "type_groups": { + "size_classes": { + "large": [ + "cv", + "av", + "bb", + "bbv", + "bc", + "cbg", + "bbg" + ], + "medium": [ + "cvl", + "ca", + "cav", + "cl", + "clt", + "cg", + "cgaa", + "cf" + ], + "small": [ + "dd", + "ddg", + "ddgaa", + "bm", + "ss", + "sc", + "ssg", + "ap" + ] + }, + "role_classes": { + "main_force": [ + "cv", + "av", + "bb", + "bbv", + "bc", + "cbg", + "bbg", + "cg", + "ddg", + "ssg" + ], + "escort": [ + "cvl", + "ca", + "cav", + "cl", + "clt", + "cgaa", + "cf", + "dd", + "ddgaa", + "bm", + "ss", + "sc", + "ap" + ] + } + }, + "ships": [ + { + "id": 1, + "name": "胡德", + "search_name": "胡德", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%83%A1%E5%BE%B7" + }, + { + "id": 2, + "name": "扶桑", + "search_name": "扶桑", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/2.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%89%B6%E6%A1%91" + }, + { + "id": 3, + "name": "山城", + "search_name": "山城", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/3.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B1%B1%E5%9F%8E" + }, + { + "id": 4, + "name": "伊势", + "search_name": "伊势", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/4.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A%E5%8A%BF" + }, + { + "id": 5, + "name": "日向", + "search_name": "日向", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/5.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A5%E5%90%91" + }, + { + "id": 6, + "name": "俾斯麦", + "search_name": "俾斯麦", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/6.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BF%BE%E6%96%AF%E9%BA%A6" + }, + { + "id": 7, + "name": "提尔比茨", + "search_name": "提尔比茨", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/7.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8F%90%E5%B0%94%E6%AF%94%E8%8C%A8" + }, + { + "id": 8, + "name": "纳尔逊", + "search_name": "纳尔逊", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/8.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%B3%E5%B0%94%E9%80%8A" + }, + { + "id": 9, + "name": "罗德尼", + "search_name": "罗德尼", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/9.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BD%97%E5%BE%B7%E5%B0%BC" + }, + { + "id": 10, + "name": "威尔士亲王", + "search_name": "威尔士亲王", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/10.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E5%B0%94%E5%A3%AB%E4%BA%B2%E7%8E%8B" + }, + { + "id": 11, + "name": "内华达", + "search_name": "内华达", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/11.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%86%85%E5%8D%8E%E8%BE%BE" + }, + { + "id": 12, + "name": "俄克拉荷马", + "search_name": "俄克拉荷马", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/12.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BF%84%E5%85%8B%E6%8B%89%E8%8D%B7%E9%A9%AC" + }, + { + "id": 13, + "name": "安德烈亚·多利亚", + "search_name": "安德烈亚·多利亚", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/13.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%89%E5%BE%B7%E7%83%88%E4%BA%9A%C2%B7%E5%A4%9A%E5%88%A9%E4%BA%9A" + }, + { + "id": 14, + "name": "金刚", + "search_name": "金刚", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/14.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%87%91%E5%88%9A" + }, + { + "id": 15, + "name": "比睿", + "search_name": "比睿", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/15.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%AF%94%E7%9D%BF" + }, + { + "id": 16, + "name": "榛名", + "search_name": "榛名", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/16.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A6%9B%E5%90%8D" + }, + { + "id": 17, + "name": "雾岛", + "search_name": "雾岛", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/17.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9B%BE%E5%B2%9B" + }, + { + "id": 18, + "name": "声望", + "search_name": "声望", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/18.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A3%B0%E6%9C%9B" + }, + { + "id": 19, + "name": "反击", + "search_name": "反击", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/19.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%8D%E5%87%BB" + }, + { + "id": 20, + "name": "阿拉斯加", + "search_name": "阿拉斯加", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/20.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E6%8B%89%E6%96%AF%E5%8A%A0" + }, + { + "id": 21, + "name": "关岛", + "search_name": "关岛", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/21.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%B3%E5%B2%9B" + }, + { + "id": 22, + "name": "赤城", + "search_name": "赤城", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/22.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B5%A4%E5%9F%8E" + }, + { + "id": 23, + "name": "加贺", + "search_name": "加贺", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/23.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E8%B4%BA" + }, + { + "id": 24, + "name": "祥凤", + "search_name": "祥凤", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/24.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A5%A5%E5%87%A4" + }, + { + "id": 25, + "name": "瑞凤", + "search_name": "瑞凤", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/25.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%91%9E%E5%87%A4" + }, + { + "id": 26, + "name": "百眼巨人", + "search_name": "百眼巨人", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/26.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%99%BE%E7%9C%BC%E5%B7%A8%E4%BA%BA" + }, + { + "id": 27, + "name": "兰利", + "search_name": "兰利", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/27.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%B0%E5%88%A9" + }, + { + "id": 28, + "name": "突击者", + "search_name": "突击者", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/28.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%AA%81%E5%87%BB%E8%80%85" + }, + { + "id": 29, + "name": "列克星敦(CV-2)", + "search_name": "列克星敦(CV-2)", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/29.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%97%E5%85%8B%E6%98%9F%E6%95%A6(CV-2)" + }, + { + "id": 30, + "name": "萨拉托加", + "search_name": "萨拉托加", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/30.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%90%A8%E6%8B%89%E6%89%98%E5%8A%A0" + }, + { + "id": 31, + "name": "大黄蜂", + "search_name": "大黄蜂", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/31.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E9%BB%84%E8%9C%82" + }, + { + "id": 32, + "name": "高雄", + "search_name": "高雄", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/32.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%AB%98%E9%9B%84" + }, + { + "id": 33, + "name": "爱宕", + "search_name": "爱宕", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/33.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%88%B1%E5%AE%95" + }, + { + "id": 34, + "name": "摩耶", + "search_name": "摩耶", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/34.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%91%A9%E8%80%B6" + }, + { + "id": 35, + "name": "鸟海", + "search_name": "鸟海", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/35.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B8%9F%E6%B5%B7" + }, + { + "id": 36, + "name": "希佩尔海军上将", + "search_name": "希佩尔海军上将", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/36.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%8C%E4%BD%A9%E5%B0%94%E6%B5%B7%E5%86%9B%E4%B8%8A%E5%B0%86" + }, + { + "id": 37, + "name": "布吕歇尔(重巡洋舰)", + "search_name": "布吕歇尔(重巡洋舰)", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/37.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E5%90%95%E6%AD%87%E5%B0%94(%E9%87%8D%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 38, + "name": "欧根亲王", + "search_name": "欧根亲王", + "variant": "normal", + "rarity": 5, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/38.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%AC%A7%E6%A0%B9%E4%BA%B2%E7%8E%8B" + }, + { + "id": 39, + "name": "威奇塔", + "search_name": "威奇塔", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/39.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E5%A5%87%E5%A1%94" + }, + { + "id": 40, + "name": "昆西", + "search_name": "昆西", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/40.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%98%86%E8%A5%BF" + }, + { + "id": 41, + "name": "天龙", + "search_name": "天龙", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/41.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E9%BE%99" + }, + { + "id": 42, + "name": "龙田", + "search_name": "龙田", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/42.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BE%99%E7%94%B0" + }, + { + "id": 43, + "name": "北上", + "search_name": "北上", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/43.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8C%97%E4%B8%8A" + }, + { + "id": 44, + "name": "大井", + "search_name": "大井", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/44.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E4%BA%95" + }, + { + "id": 45, + "name": "五十铃", + "search_name": "五十铃", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/45.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BA%94%E5%8D%81%E9%93%83" + }, + { + "id": 46, + "name": "夕张", + "search_name": "夕张", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/46.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%95%E5%BC%A0" + }, + { + "id": 47, + "name": "柯尼斯堡", + "search_name": "柯尼斯堡", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/47.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9F%AF%E5%B0%BC%E6%96%AF%E5%A0%A1" + }, + { + "id": 48, + "name": "卡尔斯鲁厄", + "search_name": "卡尔斯鲁厄", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/48.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E5%B0%94%E6%96%AF%E9%B2%81%E5%8E%84" + }, + { + "id": 49, + "name": "科隆", + "search_name": "科隆", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/49.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A7%91%E9%9A%86" + }, + { + "id": 50, + "name": "天狼星", + "search_name": "天狼星", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/50.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E7%8B%BC%E6%98%9F" + }, + { + "id": 51, + "name": "林仙", + "search_name": "林仙", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/51.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9E%97%E4%BB%99" + }, + { + "id": 52, + "name": "加拉蒂亚", + "search_name": "加拉蒂亚", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/52.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E6%8B%89%E8%92%82%E4%BA%9A" + }, + { + "id": 53, + "name": "佩内洛珀", + "search_name": "佩内洛珀", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/53.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BD%A9%E5%86%85%E6%B4%9B%E7%8F%80" + }, + { + "id": 54, + "name": "曙光女神", + "search_name": "曙光女神", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/54.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9B%99%E5%85%89%E5%A5%B3%E7%A5%9E" + }, + { + "id": 55, + "name": "奥马哈", + "search_name": "奥马哈", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/55.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A5%A5%E9%A9%AC%E5%93%88" + }, + { + "id": 56, + "name": "亚特兰大", + "search_name": "亚特兰大", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/56.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BA%9A%E7%89%B9%E5%85%B0%E5%A4%A7" + }, + { + "id": 57, + "name": "朱诺(CL-52)", + "search_name": "朱诺(CL-52)", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/57.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9C%B1%E8%AF%BA(CL-52)" + }, + { + "id": 58, + "name": "布鲁克林", + "search_name": "布鲁克林", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/58.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E9%B2%81%E5%85%8B%E6%9E%97" + }, + { + "id": 59, + "name": "海伦娜", + "search_name": "海伦娜", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/59.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B5%B7%E4%BC%A6%E5%A8%9C" + }, + { + "id": 60, + "name": "宁海", + "search_name": "宁海", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/60.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%81%E6%B5%B7" + }, + { + "id": 61, + "name": "平海", + "search_name": "平海", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/61.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B9%B3%E6%B5%B7" + }, + { + "id": 62, + "name": "罗伯茨", + "search_name": "罗伯茨", + "variant": "normal", + "rarity": 3, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/62.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BD%97%E4%BC%AF%E8%8C%A8" + }, + { + "id": 63, + "name": "阿贝克隆比", + "search_name": "阿贝克隆比", + "variant": "normal", + "rarity": 3, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/63.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E8%B4%9D%E5%85%8B%E9%9A%86%E6%AF%94" + }, + { + "id": 64, + "name": "吹雪", + "search_name": "吹雪", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/64.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%90%B9%E9%9B%AA" + }, + { + "id": 65, + "name": "白雪", + "search_name": "白雪", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/65.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%99%BD%E9%9B%AA" + }, + { + "id": 66, + "name": "初雪", + "search_name": "初雪", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/66.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%9D%E9%9B%AA" + }, + { + "id": 67, + "name": "深雪", + "search_name": "深雪", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/67.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B7%B1%E9%9B%AA" + }, + { + "id": 68, + "name": "晓", + "search_name": "晓", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/68.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%99%93" + }, + { + "id": 69, + "name": "响", + "search_name": "响", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/69.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%93%8D" + }, + { + "id": 70, + "name": "雷", + "search_name": "雷", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/70.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9B%B7" + }, + { + "id": 71, + "name": "电", + "search_name": "电", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/71.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%94%B5" + }, + { + "id": 72, + "name": "绫波", + "search_name": "绫波", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/72.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BB%AB%E6%B3%A2" + }, + { + "id": 73, + "name": "敷波", + "search_name": "敷波", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/73.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%95%B7%E6%B3%A2" + }, + { + "id": 74, + "name": "Z1", + "search_name": "Z1", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/74.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z1" + }, + { + "id": 75, + "name": "Z16", + "search_name": "Z16", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/75.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z16" + }, + { + "id": 76, + "name": "Z21", + "search_name": "Z21", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/76.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z21" + }, + { + "id": 77, + "name": "Z22", + "search_name": "Z22", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/77.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z22" + }, + { + "id": 78, + "name": "Z24", + "search_name": "Z24", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/78.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z24" + }, + { + "id": 79, + "name": "Z28", + "search_name": "Z28", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/79.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z28" + }, + { + "id": 80, + "name": "Z31", + "search_name": "Z31", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/80.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z31" + }, + { + "id": 81, + "name": "紫石英", + "search_name": "紫石英", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/81.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%B4%AB%E7%9F%B3%E8%8B%B1" + }, + { + "id": 82, + "name": "萤火虫", + "search_name": "萤火虫", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/82.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%90%A4%E7%81%AB%E8%99%AB" + }, + { + "id": 83, + "name": "标枪", + "search_name": "标枪", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/83.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A0%87%E6%9E%AA" + }, + { + "id": 84, + "name": "天后", + "search_name": "天后", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/84.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E5%90%8E" + }, + { + "id": 85, + "name": "黑背豺", + "search_name": "黑背豺", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/85.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%91%E8%83%8C%E8%B1%BA" + }, + { + "id": 86, + "name": "哥萨克人", + "search_name": "哥萨克人", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/86.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%93%A5%E8%90%A8%E5%85%8B%E4%BA%BA" + }, + { + "id": 87, + "name": "爱斯基摩人", + "search_name": "爱斯基摩人", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/87.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%88%B1%E6%96%AF%E5%9F%BA%E6%91%A9%E4%BA%BA" + }, + { + "id": 88, + "name": "旁遮普人", + "search_name": "旁遮普人", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/88.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%81%E9%81%AE%E6%99%AE%E4%BA%BA" + }, + { + "id": 89, + "name": "弗莱彻", + "search_name": "弗莱彻", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/89.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BC%97%E8%8E%B1%E5%BD%BB" + }, + { + "id": 90, + "name": "卡辛杨", + "search_name": "卡辛杨", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/90.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E8%BE%9B%E6%9D%A8" + }, + { + "id": 91, + "name": "安东尼", + "search_name": "安东尼", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/91.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%89%E4%B8%9C%E5%B0%BC" + }, + { + "id": 92, + "name": "布雷恩", + "search_name": "布雷恩", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/92.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E9%9B%B7%E6%81%A9" + }, + { + "id": 93, + "name": "基林", + "search_name": "基林", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/93.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%BA%E6%9E%97" + }, + { + "id": 94, + "name": "基阿特", + "search_name": "基阿特", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/94.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%BA%E9%98%BF%E7%89%B9" + }, + { + "id": 95, + "name": "弗兰克·诺克斯", + "search_name": "弗兰克·诺克斯", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/95.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BC%97%E5%85%B0%E5%85%8B%C2%B7%E8%AF%BA%E5%85%8B%E6%96%AF" + }, + { + "id": 96, + "name": "鲍尔", + "search_name": "鲍尔", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/96.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B2%8D%E5%B0%94" + }, + { + "id": 97, + "name": "果敢", + "search_name": "果敢", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/97.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9E%9C%E6%95%A2" + }, + { + "id": 98, + "name": "沃克兰", + "search_name": "沃克兰", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/98.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B2%83%E5%85%8B%E5%85%B0" + }, + { + "id": 99, + "name": "空想", + "search_name": "空想", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/99.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A9%BA%E6%83%B3" + }, + { + "id": 100, + "name": "狮(战列舰)", + "search_name": "狮(战列舰)", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/100.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%8B%AE(%E6%88%98%E5%88%97%E8%88%B0)" + }, + { + "id": 101, + "name": "长门", + "search_name": "长门", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/101.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%95%BF%E9%97%A8" + }, + { + "id": 102, + "name": "陆奥", + "search_name": "陆奥", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/102.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%99%86%E5%A5%A5" + }, + { + "id": 103, + "name": "皇家橡树", + "search_name": "皇家橡树", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/103.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%9A%87%E5%AE%B6%E6%A9%A1%E6%A0%91" + }, + { + "id": 104, + "name": "厌战", + "search_name": "厌战", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/104.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8E%8C%E6%88%98" + }, + { + "id": 105, + "name": "前卫", + "search_name": "前卫", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/105.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%89%8D%E5%8D%AB" + }, + { + "id": 106, + "name": "田纳西", + "search_name": "田纳西", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/106.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%94%B0%E7%BA%B3%E8%A5%BF" + }, + { + "id": 107, + "name": "加利福尼亚", + "search_name": "加利福尼亚", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/107.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E5%88%A9%E7%A6%8F%E5%B0%BC%E4%BA%9A" + }, + { + "id": 108, + "name": "科罗拉多", + "search_name": "科罗拉多", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/108.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A7%91%E7%BD%97%E6%8B%89%E5%A4%9A" + }, + { + "id": 109, + "name": "马里兰", + "search_name": "马里兰", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/109.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E9%87%8C%E5%85%B0" + }, + { + "id": 110, + "name": "西弗吉尼亚", + "search_name": "西弗吉尼亚", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/110.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%A5%BF%E5%BC%97%E5%90%89%E5%B0%BC%E4%BA%9A" + }, + { + "id": 111, + "name": "华盛顿", + "search_name": "华盛顿", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/111.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%8E%E7%9B%9B%E9%A1%BF" + }, + { + "id": 112, + "name": "维托里奥·维内托", + "search_name": "维托里奥·维内托", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/112.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BB%B4%E6%89%98%E9%87%8C%E5%A5%A5%C2%B7%E7%BB%B4%E5%86%85%E6%89%98" + }, + { + "id": 113, + "name": "黎塞留", + "search_name": "黎塞留", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/113.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%8E%E5%A1%9E%E7%95%99" + }, + { + "id": 114, + "name": "沙恩霍斯特", + "search_name": "沙恩霍斯特", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/114.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B2%99%E6%81%A9%E9%9C%8D%E6%96%AF%E7%89%B9" + }, + { + "id": 115, + "name": "格奈森瑙", + "search_name": "格奈森瑙", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/115.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A0%BC%E5%A5%88%E6%A3%AE%E7%91%99" + }, + { + "id": 117, + "name": "大凤", + "search_name": "大凤", + "variant": "normal", + "rarity": 5, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/117.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E5%87%A4" + }, + { + "id": 118, + "name": "齐柏林伯爵", + "search_name": "齐柏林伯爵", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/118.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BD%90%E6%9F%8F%E6%9E%97%E4%BC%AF%E7%88%B5" + }, + { + "id": 119, + "name": "皇家方舟(91)", + "search_name": "皇家方舟(91)", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/119.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%9A%87%E5%AE%B6%E6%96%B9%E8%88%9F(91)" + }, + { + "id": 120, + "name": "约克城", + "search_name": "约克城", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/120.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%A6%E5%85%8B%E5%9F%8E" + }, + { + "id": 121, + "name": "企业", + "search_name": "企业", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/121.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%81%E4%B8%9A" + }, + { + "id": 122, + "name": "龙骧", + "search_name": "龙骧", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/122.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BE%99%E9%AA%A7" + }, + { + "id": 123, + "name": "博格", + "search_name": "博格", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/123.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%9A%E6%A0%BC" + }, + { + "id": 124, + "name": "追赶者", + "search_name": "追赶者", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/124.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%BF%BD%E8%B5%B6%E8%80%85" + }, + { + "id": 125, + "name": "巨像", + "search_name": "巨像", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/125.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B7%A8%E5%83%8F" + }, + { + "id": 126, + "name": "普林斯顿", + "search_name": "普林斯顿", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/126.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%99%AE%E6%9E%97%E6%96%AF%E9%A1%BF" + }, + { + "id": 127, + "name": "独角兽", + "search_name": "独角兽", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/127.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%8B%AC%E8%A7%92%E5%85%BD" + }, + { + "id": 128, + "name": "德意志(装甲舰)", + "search_name": "德意志(装甲舰)", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/128.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BE%B7%E6%84%8F%E5%BF%97(%E8%A3%85%E7%94%B2%E8%88%B0)" + }, + { + "id": 129, + "name": "舍尔海军上将", + "search_name": "舍尔海军上将", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/129.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%88%8D%E5%B0%94%E6%B5%B7%E5%86%9B%E4%B8%8A%E5%B0%86" + }, + { + "id": 130, + "name": "斯佩伯爵海军上将", + "search_name": "斯佩伯爵海军上将", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/130.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%AF%E4%BD%A9%E4%BC%AF%E7%88%B5%E6%B5%B7%E5%86%9B%E4%B8%8A%E5%B0%86" + }, + { + "id": 131, + "name": "古鹰", + "search_name": "古鹰", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/131.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%A4%E9%B9%B0" + }, + { + "id": 132, + "name": "加古", + "search_name": "加古", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/132.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E5%8F%A4" + }, + { + "id": 133, + "name": "青叶", + "search_name": "青叶", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/133.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9D%92%E5%8F%B6" + }, + { + "id": 134, + "name": "衣笠", + "search_name": "衣笠", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/134.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%A1%A3%E7%AC%A0" + }, + { + "id": 135, + "name": "伦敦", + "search_name": "伦敦", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/135.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%A6%E6%95%A6" + }, + { + "id": 136, + "name": "肯特", + "search_name": "肯特", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/136.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%82%AF%E7%89%B9" + }, + { + "id": 137, + "name": "波特兰", + "search_name": "波特兰", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/137.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%A2%E7%89%B9%E5%85%B0" + }, + { + "id": 138, + "name": "印第安纳波利斯", + "search_name": "印第安纳波利斯", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/138.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%B0%E7%AC%AC%E5%AE%89%E7%BA%B3%E6%B3%A2%E5%88%A9%E6%96%AF" + }, + { + "id": 139, + "name": "彭萨科拉", + "search_name": "彭萨科拉", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/139.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BD%AD%E8%90%A8%E7%A7%91%E6%8B%89" + }, + { + "id": 140, + "name": "盐湖城", + "search_name": "盐湖城", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/140.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%9B%90%E6%B9%96%E5%9F%8E" + }, + { + "id": 141, + "name": "北安普顿", + "search_name": "北安普顿", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/141.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8C%97%E5%AE%89%E6%99%AE%E9%A1%BF" + }, + { + "id": 142, + "name": "休斯顿", + "search_name": "休斯顿", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/142.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%91%E6%96%AF%E9%A1%BF" + }, + { + "id": 143, + "name": "新奥尔良", + "search_name": "新奥尔良", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/143.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%B0%E5%A5%A5%E5%B0%94%E8%89%AF" + }, + { + "id": 144, + "name": "基洛夫", + "search_name": "基洛夫", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/144.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%BA%E6%B4%9B%E5%A4%AB" + }, + { + "id": 145, + "name": "川内", + "search_name": "川内", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/145.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B7%9D%E5%86%85" + }, + { + "id": 146, + "name": "神通", + "search_name": "神通", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/146.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A5%9E%E9%80%9A" + }, + { + "id": 147, + "name": "那珂", + "search_name": "那珂", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/147.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%82%A3%E7%8F%82" + }, + { + "id": 148, + "name": "M计划", + "search_name": "M计划", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/148.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/M%E8%AE%A1%E5%88%92" + }, + { + "id": 149, + "name": "埃姆登", + "search_name": "埃姆登", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/149.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%83%E5%A7%86%E7%99%BB" + }, + { + "id": 150, + "name": "翡翠", + "search_name": "翡翠", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/150.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BF%A1%E7%BF%A0" + }, + { + "id": 151, + "name": "进取", + "search_name": "进取", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/151.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%BF%9B%E5%8F%96" + }, + { + "id": 152, + "name": "爱丁堡", + "search_name": "爱丁堡", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/152.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%88%B1%E4%B8%81%E5%A0%A1" + }, + { + "id": 153, + "name": "贝尔法斯特", + "search_name": "贝尔法斯特", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/153.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B4%9D%E5%B0%94%E6%B3%95%E6%96%AF%E7%89%B9" + }, + { + "id": 154, + "name": "勇敢", + "search_name": "勇敢", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/154.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8B%87%E6%95%A2" + }, + { + "id": 155, + "name": "光荣(大型轻巡洋舰)", + "search_name": "光荣(大型轻巡洋舰)", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/155.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%89%E8%8D%A3(%E5%A4%A7%E5%9E%8B%E8%BD%BB%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 156, + "name": "暴怒", + "search_name": "暴怒", + "variant": "normal", + "rarity": 4, + "ship_type": "bbv", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/156.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bbv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9A%B4%E6%80%92" + }, + { + "id": 157, + "name": "圣地亚哥", + "search_name": "圣地亚哥", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/157.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%A3%E5%9C%B0%E4%BA%9A%E5%93%A5" + }, + { + "id": 158, + "name": "圣胡安", + "search_name": "圣胡安", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/158.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%A3%E8%83%A1%E5%AE%89" + }, + { + "id": 159, + "name": "索莫斯", + "search_name": "索莫斯", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/159.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%B4%A2%E8%8E%AB%E6%96%AF" + }, + { + "id": 160, + "name": "摩尔曼斯克", + "search_name": "摩尔曼斯克", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/160.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%91%A9%E5%B0%94%E6%9B%BC%E6%96%AF%E5%85%8B" + }, + { + "id": 161, + "name": "德·鲁伊特", + "search_name": "德·鲁伊特", + "variant": "normal", + "rarity": 2, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/161.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BE%B7%C2%B7%E9%B2%81%E4%BC%8A%E7%89%B9" + }, + { + "id": 162, + "name": "逸仙", + "search_name": "逸仙", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/162.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%80%B8%E4%BB%99" + }, + { + "id": 163, + "name": "维那莫依嫩", + "search_name": "维那莫依嫩", + "variant": "normal", + "rarity": 4, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/163.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BB%B4%E9%82%A3%E8%8E%AB%E4%BE%9D%E5%AB%A9" + }, + { + "id": 164, + "name": "秋月", + "search_name": "秋月", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/164.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A7%8B%E6%9C%88" + }, + { + "id": 165, + "name": "凉月", + "search_name": "凉月", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/165.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%87%89%E6%9C%88" + }, + { + "id": 166, + "name": "阳炎", + "search_name": "阳炎", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/166.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%B3%E7%82%8E" + }, + { + "id": 167, + "name": "不知火", + "search_name": "不知火", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/167.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%8D%E7%9F%A5%E7%81%AB" + }, + { + "id": 168, + "name": "黑潮", + "search_name": "黑潮", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/168.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%91%E6%BD%AE" + }, + { + "id": 169, + "name": "雪风", + "search_name": "雪风", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/169.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9B%AA%E9%A3%8E" + }, + { + "id": 170, + "name": "Z3", + "search_name": "Z3", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/170.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z3" + }, + { + "id": 171, + "name": "Z46", + "search_name": "Z46", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/171.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z46" + }, + { + "id": 172, + "name": "热心", + "search_name": "热心", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/172.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%83%AD%E5%BF%83" + }, + { + "id": 173, + "name": "阿卡司塔", + "search_name": "阿卡司塔", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/173.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E5%8D%A1%E5%8F%B8%E5%A1%94" + }, + { + "id": 174, + "name": "索玛雷兹", + "search_name": "索玛雷兹", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/174.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%B4%A2%E7%8E%9B%E9%9B%B7%E5%85%B9" + }, + { + "id": 175, + "name": "维纳斯", + "search_name": "维纳斯", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/175.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BB%B4%E7%BA%B3%E6%96%AF" + }, + { + "id": 176, + "name": "军团", + "search_name": "军团", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/176.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%86%9B%E5%9B%A2" + }, + { + "id": 177, + "name": "撒切尔", + "search_name": "撒切尔", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/177.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%92%92%E5%88%87%E5%B0%94" + }, + { + "id": 178, + "name": "沙利文", + "search_name": "沙利文", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/178.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B2%99%E5%88%A9%E6%96%87" + }, + { + "id": 179, + "name": "西格斯比", + "search_name": "西格斯比", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/179.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%A5%BF%E6%A0%BC%E6%96%AF%E6%AF%94" + }, + { + "id": 180, + "name": "奥班农", + "search_name": "奥班农", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/180.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A5%A5%E7%8F%AD%E5%86%9C" + }, + { + "id": 181, + "name": "威廉·D·波特", + "search_name": "威廉·D·波特", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/181.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E5%BB%89%C2%B7D%C2%B7%E6%B3%A2%E7%89%B9" + }, + { + "id": 182, + "name": "波特", + "search_name": "波特", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/182.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%A2%E7%89%B9" + }, + { + "id": 183, + "name": "拉菲(DD-724)", + "search_name": "拉菲(DD-724)", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/183.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8B%89%E8%8F%B2(DD-724)" + }, + { + "id": 184, + "name": "拉菲(DD-459)", + "search_name": "拉菲(DD-459)", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/184.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8B%89%E8%8F%B2(DD-459)" + }, + { + "id": 185, + "name": "卡米契亚·内拉", + "search_name": "卡米契亚·内拉", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/185.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E7%B1%B3%E5%A5%91%E4%BA%9A%C2%B7%E5%86%85%E6%8B%89" + }, + { + "id": 186, + "name": "阿维埃尔", + "search_name": "阿维埃尔", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/186.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E7%BB%B4%E5%9F%83%E5%B0%94" + }, + { + "id": 187, + "name": "安东尼奥·达诺利", + "search_name": "安东尼奥·达诺利", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/187.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%89%E4%B8%9C%E5%B0%BC%E5%A5%A5%C2%B7%E8%BE%BE%E8%AF%BA%E5%88%A9" + }, + { + "id": 188, + "name": "乌戈里尼·维瓦尔迪", + "search_name": "乌戈里尼·维瓦尔迪", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/188.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B9%8C%E6%88%88%E9%87%8C%E5%B0%BC%C2%B7%E7%BB%B4%E7%93%A6%E5%B0%94%E8%BF%AA" + }, + { + "id": 189, + "name": "天城", + "search_name": "天城", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/189.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E5%9F%8E" + }, + { + "id": 190, + "name": "土佐", + "search_name": "土佐", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/190.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%9F%E4%BD%90" + }, + { + "id": 191, + "name": "A150", + "search_name": "A150", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/191.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/A150" + }, + { + "id": 192, + "name": "塔什干", + "search_name": "塔什干", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/192.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%94%E4%BB%80%E5%B9%B2" + }, + { + "id": 193, + "name": "恩格斯", + "search_name": "恩格斯", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/193.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%81%A9%E6%A0%BC%E6%96%AF" + }, + { + "id": 194, + "name": "大青花鱼", + "search_name": "大青花鱼", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/194.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E9%9D%92%E8%8A%B1%E9%B1%BC" + }, + { + "id": 195, + "name": "射水鱼", + "search_name": "射水鱼", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/195.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B0%84%E6%B0%B4%E9%B1%BC" + }, + { + "id": 196, + "name": "M1", + "search_name": "M1", + "variant": "normal", + "rarity": 3, + "ship_type": "sc", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/196.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/sc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/M1" + }, + { + "id": 197, + "name": "U-47", + "search_name": "U-47", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/197.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-47" + }, + { + "id": 198, + "name": "U-505", + "search_name": "U-505", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/198.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-505" + }, + { + "id": 199, + "name": "絮库夫", + "search_name": "絮库夫", + "variant": "normal", + "rarity": 3, + "ship_type": "sc", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/199.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/sc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%B5%AE%E5%BA%93%E5%A4%AB" + }, + { + "id": 200, + "name": "兴登堡", + "search_name": "兴登堡", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/200.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%B4%E7%99%BB%E5%A0%A1" + }, + { + "id": 201, + "name": "V方案", + "search_name": "V方案", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "other", + "portrait": "assets/portraits/201.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/V%E6%96%B9%E6%A1%88" + }, + { + "id": 202, + "name": "伊利诺伊", + "search_name": "伊利诺伊", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/202.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A%E5%88%A9%E8%AF%BA%E4%BC%8A" + }, + { + "id": 203, + "name": "伊丽莎白女王(00)", + "search_name": "伊丽莎白女王(00)", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/203.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A%E4%B8%BD%E8%8E%8E%E7%99%BD%E5%A5%B3%E7%8E%8B(00)" + }, + { + "id": 205, + "name": "约克公爵", + "search_name": "约克公爵", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/205.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%A6%E5%85%8B%E5%85%AC%E7%88%B5" + }, + { + "id": 206, + "name": "北卡罗来纳", + "search_name": "北卡罗来纳", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/206.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8C%97%E5%8D%A1%E7%BD%97%E6%9D%A5%E7%BA%B3" + }, + { + "id": 207, + "name": "南达科他(BB-57)", + "search_name": "南达科他(BB-57)", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/207.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%97%E8%BE%BE%E7%A7%91%E4%BB%96(BB-57)" + }, + { + "id": 208, + "name": "马萨诸塞", + "search_name": "马萨诸塞", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/208.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E8%90%A8%E8%AF%B8%E5%A1%9E" + }, + { + "id": 209, + "name": "密苏里", + "search_name": "密苏里", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/209.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AF%86%E8%8B%8F%E9%87%8C" + }, + { + "id": 210, + "name": "衣阿华", + "search_name": "衣阿华", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/210.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%A1%A3%E9%98%BF%E5%8D%8E" + }, + { + "id": 211, + "name": "卡约·杜伊里奥", + "search_name": "卡约·杜伊里奥", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/211.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E7%BA%A6%C2%B7%E6%9D%9C%E4%BC%8A%E9%87%8C%E5%A5%A5" + }, + { + "id": 212, + "name": "利托里奥", + "search_name": "利托里奥", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/212.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%A9%E6%89%98%E9%87%8C%E5%A5%A5" + }, + { + "id": 213, + "name": "罗马", + "search_name": "罗马", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/213.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BD%97%E9%A9%AC" + }, + { + "id": 214, + "name": "苏联", + "search_name": "苏联", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/214.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8B%8F%E8%81%94" + }, + { + "id": 215, + "name": "玛丽亚皇后", + "search_name": "玛丽亚皇后", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/215.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%8E%9B%E4%B8%BD%E4%BA%9A%E7%9A%87%E5%90%8E" + }, + { + "id": 216, + "name": "敦刻尔克", + "search_name": "敦刻尔克", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/216.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%95%A6%E5%88%BB%E5%B0%94%E5%85%8B" + }, + { + "id": 217, + "name": "斯特拉斯堡", + "search_name": "斯特拉斯堡", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/217.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%AF%E7%89%B9%E6%8B%89%E6%96%AF%E5%A0%A1" + }, + { + "id": 218, + "name": "古斯塔夫五世", + "search_name": "古斯塔夫五世", + "variant": "normal", + "rarity": 4, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/218.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%A4%E6%96%AF%E5%A1%94%E5%A4%AB%E4%BA%94%E4%B8%96" + }, + { + "id": 219, + "name": "瑞鹤", + "search_name": "瑞鹤", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/219.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%91%9E%E9%B9%A4" + }, + { + "id": 220, + "name": "翔鹤", + "search_name": "翔鹤", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/220.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BF%94%E9%B9%A4" + }, + { + "id": 221, + "name": "飞龙", + "search_name": "飞龙", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/221.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A3%9E%E9%BE%99" + }, + { + "id": 222, + "name": "苍龙", + "search_name": "苍龙", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/222.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8B%8D%E9%BE%99" + }, + { + "id": 223, + "name": "信浓", + "search_name": "信浓", + "variant": "normal", + "rarity": 6, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/223.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BF%A1%E6%B5%93" + }, + { + "id": 224, + "name": "可畏", + "search_name": "可畏", + "variant": "normal", + "rarity": 5, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/224.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%AF%E7%95%8F" + }, + { + "id": 225, + "name": "黄蜂(CV-7)", + "search_name": "黄蜂(CV-7)", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/225.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%84%E8%9C%82(CV-7)" + }, + { + "id": 226, + "name": "埃塞克斯", + "search_name": "埃塞克斯", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/226.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%83%E5%A1%9E%E5%85%8B%E6%96%AF" + }, + { + "id": 227, + "name": "飞鹰", + "search_name": "飞鹰", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/227.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A3%9E%E9%B9%B0" + }, + { + "id": 228, + "name": "隼鹰", + "search_name": "隼鹰", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/228.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9A%BC%E9%B9%B0" + }, + { + "id": 229, + "name": "凤翔", + "search_name": "凤翔", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/229.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%87%A4%E7%BF%94" + }, + { + "id": 230, + "name": "竞技神", + "search_name": "竞技神", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/230.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%AB%9E%E6%8A%80%E7%A5%9E" + }, + { + "id": 231, + "name": "伦道夫", + "search_name": "伦道夫", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/231.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%A6%E9%81%93%E5%A4%AB" + }, + { + "id": 232, + "name": "贝亚恩", + "search_name": "贝亚恩", + "variant": "normal", + "rarity": 3, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/232.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B4%9D%E4%BA%9A%E6%81%A9" + }, + { + "id": 233, + "name": "最上", + "search_name": "最上", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/233.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9C%80%E4%B8%8A" + }, + { + "id": 234, + "name": "三隈", + "search_name": "三隈", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/234.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%89%E9%9A%88" + }, + { + "id": 235, + "name": "铃谷", + "search_name": "铃谷", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/235.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%93%83%E8%B0%B7" + }, + { + "id": 236, + "name": "熊野", + "search_name": "熊野", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/236.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%86%8A%E9%87%8E" + }, + { + "id": 237, + "name": "萨福克", + "search_name": "萨福克", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/237.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%90%A8%E7%A6%8F%E5%85%8B" + }, + { + "id": 238, + "name": "约克", + "search_name": "约克", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/238.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%A6%E5%85%8B" + }, + { + "id": 239, + "name": "埃克赛特", + "search_name": "埃克赛特", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/239.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%83%E5%85%8B%E8%B5%9B%E7%89%B9" + }, + { + "id": 240, + "name": "旧金山", + "search_name": "旧金山", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/240.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A7%E9%87%91%E5%B1%B1" + }, + { + "id": 241, + "name": "巴尔的摩", + "search_name": "巴尔的摩", + "variant": "normal", + "rarity": 5, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/241.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B7%B4%E5%B0%94%E7%9A%84%E6%91%A9" + }, + { + "id": 242, + "name": "卡德", + "search_name": "卡德", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/242.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E5%BE%B7" + }, + { + "id": 243, + "name": "德梅因", + "search_name": "德梅因", + "variant": "normal", + "rarity": 6, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/243.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BE%B7%E6%A2%85%E5%9B%A0" + }, + { + "id": 244, + "name": "灵敏", + "search_name": "灵敏", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/244.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%81%B5%E6%95%8F" + }, + { + "id": 245, + "name": "扎拉", + "search_name": "扎拉", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/245.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%89%8E%E6%8B%89" + }, + { + "id": 246, + "name": "阿尔及利亚", + "search_name": "阿尔及利亚", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/246.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E5%B0%94%E5%8F%8A%E5%88%A9%E4%BA%9A" + }, + { + "id": 247, + "name": "香取", + "search_name": "香取", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/247.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A6%99%E5%8F%96" + }, + { + "id": 248, + "name": "大淀", + "search_name": "大淀", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/248.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E6%B7%80" + }, + { + "id": 249, + "name": "莱比锡", + "search_name": "莱比锡", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/249.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8E%B1%E6%AF%94%E9%94%A1" + }, + { + "id": 250, + "name": "伍斯特", + "search_name": "伍斯特", + "variant": "normal", + "rarity": 6, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/250.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8D%E6%96%AF%E7%89%B9" + }, + { + "id": 251, + "name": "奥克兰", + "search_name": "奥克兰", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/251.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A5%A5%E5%85%8B%E5%85%B0" + }, + { + "id": 252, + "name": "克利夫兰", + "search_name": "克利夫兰", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/252.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%8B%E5%88%A9%E5%A4%AB%E5%85%B0" + }, + { + "id": 253, + "name": "应瑞", + "search_name": "应瑞", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/253.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BA%94%E7%91%9E" + }, + { + "id": 254, + "name": "肇和", + "search_name": "肇和", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/254.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%82%87%E5%92%8C" + }, + { + "id": 255, + "name": "加罗林", + "search_name": "加罗林", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/255.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E7%BD%97%E6%9E%97" + }, + { + "id": 256, + "name": "布莱克", + "search_name": "布莱克", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/256.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E8%8E%B1%E5%85%8B" + }, + { + "id": 257, + "name": "阿尔比翁", + "search_name": "阿尔比翁", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/257.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E5%B0%94%E6%AF%94%E7%BF%81" + }, + { + "id": 258, + "name": "高波", + "search_name": "高波", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/258.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%AB%98%E6%B3%A2" + }, + { + "id": 259, + "name": "吞武里", + "search_name": "吞武里", + "variant": "normal", + "rarity": 4, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/259.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%90%9E%E6%AD%A6%E9%87%8C" + }, + { + "id": 260, + "name": "睦月", + "search_name": "睦月", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/260.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%9D%A6%E6%9C%88" + }, + { + "id": 261, + "name": "白露", + "search_name": "白露", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/261.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%99%BD%E9%9C%B2" + }, + { + "id": 262, + "name": "时雨", + "search_name": "时雨", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/262.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%B6%E9%9B%A8" + }, + { + "id": 263, + "name": "村雨", + "search_name": "村雨", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/263.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9D%91%E9%9B%A8" + }, + { + "id": 264, + "name": "夕立", + "search_name": "夕立", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/264.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%95%E7%AB%8B" + }, + { + "id": 265, + "name": "岚", + "search_name": "岚", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/265.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B2%9A" + }, + { + "id": 266, + "name": "初夏", + "search_name": "初夏", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/266.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%9D%E5%A4%8F" + }, + { + "id": 267, + "name": "岛风(岛风型驱逐舰)", + "search_name": "岛风(岛风型驱逐舰)", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/267.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B2%9B%E9%A3%8E(%E5%B2%9B%E9%A3%8E%E5%9E%8B%E9%A9%B1%E9%80%90%E8%88%B0)" + }, + { + "id": 268, + "name": "峰风", + "search_name": "峰风", + "variant": "normal", + "rarity": 1, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/268.webp", + "background": "assets/backgrounds/rarity-1.webp", + "frame": "assets/frames/rarity-1.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B3%B0%E9%A3%8E" + }, + { + "id": 269, + "name": "Z17", + "search_name": "Z17", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/269.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z17" + }, + { + "id": 270, + "name": "Z18", + "search_name": "Z18", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/270.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z18" + }, + { + "id": 271, + "name": "吸血鬼", + "search_name": "吸血鬼", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/271.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%90%B8%E8%A1%80%E9%AC%BC" + }, + { + "id": 272, + "name": "海达人", + "search_name": "海达人", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/272.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B5%B7%E8%BE%BE%E4%BA%BA" + }, + { + "id": 273, + "name": "塞尔弗里奇", + "search_name": "塞尔弗里奇", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/273.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%9E%E5%B0%94%E5%BC%97%E9%87%8C%E5%A5%87" + }, + { + "id": 274, + "name": "X1", + "search_name": "X1", + "variant": "normal", + "rarity": 3, + "ship_type": "sc", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/274.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/sc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/X1" + }, + { + "id": 275, + "name": "康弗斯", + "search_name": "康弗斯", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/275.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BA%B7%E5%BC%97%E6%96%AF" + }, + { + "id": 276, + "name": "戴森", + "search_name": "戴森", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/276.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%88%B4%E6%A3%AE" + }, + { + "id": 277, + "name": "克拉克斯顿", + "search_name": "克拉克斯顿", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/277.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%8B%E6%8B%89%E5%85%8B%E6%96%AF%E9%A1%BF" + }, + { + "id": 278, + "name": "霍埃尔", + "search_name": "霍埃尔", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/278.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9C%8D%E5%9F%83%E5%B0%94" + }, + { + "id": 279, + "name": "塞缪尔·B·罗伯茨", + "search_name": "塞缪尔·B·罗伯茨", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/279.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%9E%E7%BC%AA%E5%B0%94%C2%B7B%C2%B7%E7%BD%97%E4%BC%AF%E8%8C%A8" + }, + { + "id": 280, + "name": "约翰斯顿", + "search_name": "约翰斯顿", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/280.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%A6%E7%BF%B0%E6%96%AF%E9%A1%BF" + }, + { + "id": 281, + "name": "雷鸣", + "search_name": "雷鸣", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/281.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9B%B7%E9%B8%A3" + }, + { + "id": 282, + "name": "潜甲", + "search_name": "潜甲", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/282.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%BD%9C%E7%94%B2" + }, + { + "id": 283, + "name": "潜乙", + "search_name": "潜乙", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/283.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%BD%9C%E4%B9%99" + }, + { + "id": 284, + "name": "布吕歇尔(装甲巡洋舰)", + "search_name": "布吕歇尔(装甲巡洋舰)", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/284.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E5%90%95%E6%AD%87%E5%B0%94(%E8%A3%85%E7%94%B2%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 285, + "name": "85工程", + "search_name": "85工程", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/285.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/85%E5%B7%A5%E7%A8%8B" + }, + { + "id": 286, + "name": "不挠(战列巡洋舰)", + "search_name": "不挠(战列巡洋舰)", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/286.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%8D%E6%8C%A0(%E6%88%98%E5%88%97%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 287, + "name": "鹰潭", + "search_name": "鹰潭", + "variant": "normal", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/287.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B9%B0%E6%BD%AD" + }, + { + "id": 288, + "name": "U-552", + "search_name": "U-552", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/288.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-552" + }, + { + "id": 289, + "name": "U-81", + "search_name": "U-81", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/289.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-81" + }, + { + "id": 290, + "name": "U-96", + "search_name": "U-96", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/290.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-96" + }, + { + "id": 291, + "name": "U-2540", + "search_name": "U-2540", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/291.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-2540" + }, + { + "id": 292, + "name": "U-156", + "search_name": "U-156", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/292.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-156" + }, + { + "id": 293, + "name": "U-1206", + "search_name": "U-1206", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/293.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-1206" + }, + { + "id": 294, + "name": "刺尾鱼", + "search_name": "刺尾鱼", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/294.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%BA%E5%B0%BE%E9%B1%BC" + }, + { + "id": 295, + "name": "S-56", + "search_name": "S-56", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/295.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/S-56" + }, + { + "id": 296, + "name": "贝劳伍德", + "search_name": "贝劳伍德", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/296.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B4%9D%E5%8A%B3%E4%BC%8D%E5%BE%B7" + }, + { + "id": 297, + "name": "乔治·埃夫洛夫", + "search_name": "乔治·埃夫洛夫", + "variant": "normal", + "rarity": 5, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/297.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B9%94%E6%B2%BB%C2%B7%E5%9F%83%E5%A4%AB%E6%B4%9B%E5%A4%AB" + }, + { + "id": 298, + "name": "苏赫巴托尔", + "search_name": "苏赫巴托尔", + "variant": "normal", + "rarity": 6, + "ship_type": "ap", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/298.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ap.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8B%8F%E8%B5%AB%E5%B7%B4%E6%89%98%E5%B0%94" + }, + { + "id": 299, + "name": "让巴尔", + "search_name": "让巴尔", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/299.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%AE%A9%E5%B7%B4%E5%B0%94" + }, + { + "id": 300, + "name": "马耳他", + "search_name": "马耳他", + "variant": "normal", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/300.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E8%80%B3%E4%BB%96" + }, + { + "id": 301, + "name": "马汉", + "search_name": "马汉", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/301.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E6%B1%89" + }, + { + "id": 302, + "name": "圣路易斯", + "search_name": "圣路易斯", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/302.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%A3%E8%B7%AF%E6%98%93%E6%96%AF" + }, + { + "id": 303, + "name": "奥丁", + "search_name": "奥丁", + "variant": "normal", + "rarity": 5, + "ship_type": "ap", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/303.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ap.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A5%A5%E4%B8%81" + }, + { + "id": 304, + "name": "圣女贞德", + "search_name": "圣女贞德", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/304.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%A3%E5%A5%B3%E8%B4%9E%E5%BE%B7" + }, + { + "id": 305, + "name": "英王乔治五世", + "search_name": "英王乔治五世", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/305.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8B%B1%E7%8E%8B%E4%B9%94%E6%B2%BB%E4%BA%94%E4%B8%96" + }, + { + "id": 306, + "name": "巴夫勒尔", + "search_name": "巴夫勒尔", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/306.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B7%B4%E5%A4%AB%E5%8B%92%E5%B0%94" + }, + { + "id": 307, + "name": "女灶神", + "search_name": "女灶神", + "variant": "normal", + "rarity": 5, + "ship_type": "ap", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/307.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ap.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A5%B3%E7%81%B6%E7%A5%9E" + }, + { + "id": 308, + "name": "哥特兰", + "search_name": "哥特兰", + "variant": "normal", + "rarity": 4, + "ship_type": "cav", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/308.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cav.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%93%A5%E7%89%B9%E5%85%B0" + }, + { + "id": 309, + "name": "诺夫哥罗德", + "search_name": "诺夫哥罗德", + "variant": "normal", + "rarity": 6, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/309.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%AF%BA%E5%A4%AB%E5%93%A5%E7%BD%97%E5%BE%B7" + }, + { + "id": 310, + "name": "库欣", + "search_name": "库欣", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/310.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BA%93%E6%AC%A3" + }, + { + "id": 311, + "name": "瓜达卡纳尔", + "search_name": "瓜达卡纳尔", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/311.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%93%9C%E8%BE%BE%E5%8D%A1%E7%BA%B3%E5%B0%94" + }, + { + "id": 312, + "name": "纽伦堡", + "search_name": "纽伦堡", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/312.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%BD%E4%BC%A6%E5%A0%A1" + }, + { + "id": 313, + "name": "阿贾克斯", + "search_name": "阿贾克斯", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/313.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E8%B4%BE%E5%85%8B%E6%96%AF" + }, + { + "id": 314, + "name": "哥特雄狮", + "search_name": "哥特雄狮", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/314.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%93%A5%E7%89%B9%E9%9B%84%E7%8B%AE" + }, + { + "id": 315, + "name": "宵月", + "search_name": "宵月", + "variant": "normal", + "rarity": 2, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/315.webp", + "background": "assets/backgrounds/rarity-2.webp", + "frame": "assets/frames/rarity-2.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%B5%E6%9C%88" + }, + { + "id": 316, + "name": "明斯克", + "search_name": "明斯克", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/316.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%98%8E%E6%96%AF%E5%85%8B" + }, + { + "id": 317, + "name": "M2", + "search_name": "M2", + "variant": "normal", + "rarity": 3, + "ship_type": "sc", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/317.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/sc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/M2" + }, + { + "id": 318, + "name": "毛奇", + "search_name": "毛奇", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/318.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%AF%9B%E5%A5%87" + }, + { + "id": 319, + "name": "不挠(装甲航母)", + "search_name": "不挠(装甲航母)", + "variant": "normal", + "rarity": 5, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/319.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%8D%E6%8C%A0(%E8%A3%85%E7%94%B2%E8%88%AA%E6%AF%8D)" + }, + { + "id": 320, + "name": "鹞鹰", + "search_name": "鹞鹰", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/320.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B9%9E%E9%B9%B0" + }, + { + "id": 321, + "name": "费拉迪D", + "search_name": "费拉迪D", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/321.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B4%B9%E6%8B%89%E8%BF%AAD" + }, + { + "id": 322, + "name": "希尔曼", + "search_name": "希尔曼", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/322.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%8C%E5%B0%94%E6%9B%BC" + }, + { + "id": 323, + "name": "基辅", + "search_name": "基辅", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/323.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%BA%E8%BE%85" + }, + { + "id": 324, + "name": "塔斯卡卢萨", + "search_name": "塔斯卡卢萨", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/324.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%94%E6%96%AF%E5%8D%A1%E5%8D%A2%E8%90%A8" + }, + { + "id": 325, + "name": "列克星敦(CV-16)", + "search_name": "列克星敦(CV-16)", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/325.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%97%E5%85%8B%E6%98%9F%E6%95%A6(CV-16)" + }, + { + "id": 326, + "name": "诺福克(78)", + "search_name": "诺福克(78)", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/326.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%AF%BA%E7%A6%8F%E5%85%8B(78)" + }, + { + "id": 327, + "name": "斯特雷特", + "search_name": "斯特雷特", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/327.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%AF%E7%89%B9%E9%9B%B7%E7%89%B9" + }, + { + "id": 328, + "name": "妙高", + "search_name": "妙高", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/328.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A6%99%E9%AB%98" + }, + { + "id": 329, + "name": "奥古斯塔", + "search_name": "奥古斯塔", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/329.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A5%A5%E5%8F%A4%E6%96%AF%E5%A1%94" + }, + { + "id": 330, + "name": "卫士", + "search_name": "卫士", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/330.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%AB%E5%A3%AB" + }, + { + "id": 331, + "name": "无比", + "search_name": "无比", + "variant": "normal", + "rarity": 6, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/331.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A0%E6%AF%94" + }, + { + "id": 332, + "name": "神鹰", + "search_name": "神鹰", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/332.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A5%9E%E9%B9%B0" + }, + { + "id": 333, + "name": "德格拉斯", + "search_name": "德格拉斯", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/333.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BE%B7%E6%A0%BC%E6%8B%89%E6%96%AF" + }, + { + "id": 334, + "name": "不惧(驱逐舰)", + "search_name": "不惧(驱逐舰)", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/334.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%8D%E6%83%A7(%E9%A9%B1%E9%80%90%E8%88%B0)" + }, + { + "id": 335, + "name": "伏尔塔", + "search_name": "伏尔塔", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/335.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8F%E5%B0%94%E5%A1%94" + }, + { + "id": 336, + "name": "竹", + "search_name": "竹", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/336.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%AB%B9" + }, + { + "id": 337, + "name": "伟大的庞贝", + "search_name": "伟大的庞贝", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/337.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%9F%E5%A4%A7%E7%9A%84%E5%BA%9E%E8%B4%9D" + }, + { + "id": 338, + "name": "天鹰", + "search_name": "天鹰", + "variant": "normal", + "rarity": 5, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/338.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E9%B9%B0" + }, + { + "id": 339, + "name": "帝国", + "search_name": "帝国", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/339.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%9D%E5%9B%BD" + }, + { + "id": 340, + "name": "波尔扎诺", + "search_name": "波尔扎诺", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/340.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%A2%E5%B0%94%E6%89%8E%E8%AF%BA" + }, + { + "id": 341, + "name": "龙骑兵", + "search_name": "龙骑兵", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/341.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BE%99%E9%AA%91%E5%85%B5" + }, + { + "id": 342, + "name": "江原", + "search_name": "江原", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/342.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B1%9F%E5%8E%9F" + }, + { + "id": 343, + "name": "蔚山", + "search_name": "蔚山", + "variant": "normal", + "rarity": 5, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "other", + "portrait": "assets/portraits/343.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%94%9A%E5%B1%B1" + }, + { + "id": 344, + "name": "忠武", + "search_name": "忠武", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/344.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BF%A0%E6%AD%A6" + }, + { + "id": 345, + "name": "威斯康星", + "search_name": "威斯康星", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/345.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E6%96%AF%E5%BA%B7%E6%98%9F" + }, + { + "id": 346, + "name": "谢菲尔德", + "search_name": "谢菲尔德", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/346.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B0%A2%E8%8F%B2%E5%B0%94%E5%BE%B7" + }, + { + "id": 347, + "name": "蒙彼利埃", + "search_name": "蒙彼利埃", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/347.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%92%99%E5%BD%BC%E5%88%A9%E5%9F%83" + }, + { + "id": 348, + "name": "丹佛", + "search_name": "丹佛", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/348.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%B9%E4%BD%9B" + }, + { + "id": 349, + "name": "初月", + "search_name": "初月", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/349.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%9D%E6%9C%88" + }, + { + "id": 350, + "name": "菲尔普斯", + "search_name": "菲尔普斯", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/350.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8F%B2%E5%B0%94%E6%99%AE%E6%96%AF" + }, + { + "id": 351, + "name": "U-1405", + "search_name": "U-1405", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/351.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-1405" + }, + { + "id": 352, + "name": "莫斯科", + "search_name": "莫斯科", + "variant": "normal", + "rarity": 6, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/352.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8E%AB%E6%96%AF%E7%A7%91" + }, + { + "id": 353, + "name": "斯维尔德洛夫", + "search_name": "斯维尔德洛夫", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/353.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%AF%E7%BB%B4%E5%B0%94%E5%BE%B7%E6%B4%9B%E5%A4%AB" + }, + { + "id": 354, + "name": "阿尔贝托·迪·朱桑诺", + "search_name": "阿尔贝托·迪·朱桑诺", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/354.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E5%B0%94%E8%B4%9D%E6%89%98%C2%B7%E8%BF%AA%C2%B7%E6%9C%B1%E6%A1%91%E8%AF%BA" + }, + { + "id": 355, + "name": "联合力量", + "search_name": "联合力量", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "other", + "portrait": "assets/portraits/355.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%81%94%E5%90%88%E5%8A%9B%E9%87%8F" + }, + { + "id": 356, + "name": "爱丽", + "search_name": "爱丽", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/356.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%88%B1%E4%B8%BD" + }, + { + "id": 357, + "name": "羽黑", + "search_name": "羽黑", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/357.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BE%BD%E9%BB%91" + }, + { + "id": 358, + "name": "天津风", + "search_name": "天津风", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/358.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E6%B4%A5%E9%A3%8E" + }, + { + "id": 359, + "name": "吕-34", + "search_name": "吕-34", + "variant": "normal", + "rarity": 3, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/359.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%90%95-34" + }, + { + "id": 360, + "name": "虎(轻巡洋舰)", + "search_name": "虎(轻巡洋舰)", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/360.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%99%8E(%E8%BD%BB%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 361, + "name": "K1", + "search_name": "K1", + "variant": "normal", + "rarity": 3, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/361.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/K1" + }, + { + "id": 362, + "name": "星座", + "search_name": "星座", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/362.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%98%9F%E5%BA%A7" + }, + { + "id": 363, + "name": "炽热", + "search_name": "炽热", + "variant": "normal", + "rarity": 4, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/363.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%82%BD%E7%83%AD" + }, + { + "id": 364, + "name": "加纳里亚斯", + "search_name": "加纳里亚斯", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/364.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E7%BA%B3%E9%87%8C%E4%BA%9A%E6%96%AF" + }, + { + "id": 365, + "name": "门德斯·努涅斯", + "search_name": "门德斯·努涅斯", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/365.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%97%A8%E5%BE%B7%E6%96%AF%C2%B7%E5%8A%AA%E6%B6%85%E6%96%AF" + }, + { + "id": 366, + "name": "鹦鹉螺", + "search_name": "鹦鹉螺", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/366.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B9%A6%E9%B9%89%E8%9E%BA" + }, + { + "id": 367, + "name": "乌尔里希·冯·胡滕", + "search_name": "乌尔里希·冯·胡滕", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/367.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B9%8C%E5%B0%94%E9%87%8C%E5%B8%8C%C2%B7%E5%86%AF%C2%B7%E8%83%A1%E6%BB%95" + }, + { + "id": 368, + "name": "塞德利茨", + "search_name": "塞德利茨", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/368.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%9E%E5%BE%B7%E5%88%A9%E8%8C%A8" + }, + { + "id": 369, + "name": "克莱夫勋爵", + "search_name": "克莱夫勋爵", + "variant": "normal", + "rarity": 4, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/369.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%8B%E8%8E%B1%E5%A4%AB%E5%8B%8B%E7%88%B5" + }, + { + "id": 370, + "name": "光辉", + "search_name": "光辉", + "variant": "normal", + "rarity": 5, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/370.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%89%E8%BE%89" + }, + { + "id": 371, + "name": "海王星", + "search_name": "海王星", + "variant": "normal", + "rarity": 6, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/371.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B5%B7%E7%8E%8B%E6%98%9F" + }, + { + "id": 372, + "name": "早春", + "search_name": "早春", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/372.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A9%E6%98%A5" + }, + { + "id": 373, + "name": "莱昂纳多·达·芬奇", + "search_name": "莱昂纳多·达·芬奇", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/373.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8E%B1%E6%98%82%E7%BA%B3%E5%A4%9A%C2%B7%E8%BE%BE%C2%B7%E8%8A%AC%E5%A5%87" + }, + { + "id": 374, + "name": "汉考克", + "search_name": "汉考克", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/374.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B1%89%E8%80%83%E5%85%8B" + }, + { + "id": 375, + "name": "圣哈辛托", + "search_name": "圣哈辛托", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/375.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%A3%E5%93%88%E8%BE%9B%E6%89%98" + }, + { + "id": 376, + "name": "埃德加·居内", + "search_name": "埃德加·居内", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/376.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%83%E5%BE%B7%E5%8A%A0%C2%B7%E5%B1%85%E5%86%85" + }, + { + "id": 377, + "name": "木曾", + "search_name": "木曾", + "variant": "normal", + "rarity": 4, + "ship_type": "clt", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/377.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/clt.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9C%A8%E6%9B%BE" + }, + { + "id": 378, + "name": "斯普利特", + "search_name": "斯普利特", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/378.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%AF%E6%99%AE%E5%88%A9%E7%89%B9" + }, + { + "id": 379, + "name": "哥伦比亚", + "search_name": "哥伦比亚", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/379.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%93%A5%E4%BC%A6%E6%AF%94%E4%BA%9A" + }, + { + "id": 380, + "name": "圣乔治", + "search_name": "圣乔治", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/380.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%A3%E4%B9%94%E6%B2%BB" + }, + { + "id": 381, + "name": "印第安纳", + "search_name": "印第安纳", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/381.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%B0%E7%AC%AC%E5%AE%89%E7%BA%B3" + }, + { + "id": 382, + "name": "坎伯兰", + "search_name": "坎伯兰", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/382.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9D%8E%E4%BC%AF%E5%85%B0" + }, + { + "id": 383, + "name": "奥斯塔公爵", + "search_name": "奥斯塔公爵", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/383.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A5%A5%E6%96%AF%E5%A1%94%E5%85%AC%E7%88%B5" + }, + { + "id": 384, + "name": "法迪布鲁诺", + "search_name": "法迪布鲁诺", + "variant": "normal", + "rarity": 4, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/384.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%95%E8%BF%AA%E5%B8%83%E9%B2%81%E8%AF%BA" + }, + { + "id": 385, + "name": "S113", + "search_name": "S113", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/385.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/S113" + }, + { + "id": 386, + "name": "莉安夕", + "search_name": "莉安夕", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/386.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8E%89%E5%AE%89%E5%A4%95" + }, + { + "id": 387, + "name": "海圻", + "search_name": "海圻", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/387.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B5%B7%E5%9C%BB" + }, + { + "id": 388, + "name": "纽波特纽斯", + "search_name": "纽波特纽斯", + "variant": "normal", + "rarity": 6, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/388.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%BD%E6%B3%A2%E7%89%B9%E7%BA%BD%E6%96%AF" + }, + { + "id": 389, + "name": "留里克", + "search_name": "留里克", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/389.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%95%99%E9%87%8C%E5%85%8B" + }, + { + "id": 390, + "name": "库图佐夫", + "search_name": "库图佐夫", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/390.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BA%93%E5%9B%BE%E4%BD%90%E5%A4%AB" + }, + { + "id": 391, + "name": "查尔斯·F·亚当斯", + "search_name": "查尔斯·F·亚当斯", + "variant": "normal", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/391.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9F%A5%E5%B0%94%E6%96%AF%C2%B7F%C2%B7%E4%BA%9A%E5%BD%93%E6%96%AF" + }, + { + "id": 392, + "name": "天雾", + "search_name": "天雾", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/392.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E9%9B%BE" + }, + { + "id": 393, + "name": "查尔斯·奥斯本", + "search_name": "查尔斯·奥斯本", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/393.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9F%A5%E5%B0%94%E6%96%AF%C2%B7%E5%A5%A5%E6%96%AF%E6%9C%AC" + }, + { + "id": 394, + "name": "泰勒", + "search_name": "泰勒", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/394.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%B0%E5%8B%92" + }, + { + "id": 395, + "name": "闪电", + "search_name": "闪电", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/395.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%97%AA%E7%94%B5" + }, + { + "id": 396, + "name": "新墨西哥", + "search_name": "新墨西哥", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/396.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%B0%E5%A2%A8%E8%A5%BF%E5%93%A5" + }, + { + "id": 397, + "name": "斯大林格勒", + "search_name": "斯大林格勒", + "variant": "normal", + "rarity": 6, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/397.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%AF%E5%A4%A7%E6%9E%97%E6%A0%BC%E5%8B%92" + }, + { + "id": 398, + "name": "德里", + "search_name": "德里", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/398.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BE%B7%E9%87%8C" + }, + { + "id": 399, + "name": "阿布鲁奇公爵", + "search_name": "阿布鲁奇公爵", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/399.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E5%B8%83%E9%B2%81%E5%A5%87%E5%85%AC%E7%88%B5" + }, + { + "id": 400, + "name": "七省联盟", + "search_name": "七省联盟", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/400.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%83%E7%9C%81%E8%81%94%E7%9B%9F" + }, + { + "id": 401, + "name": "胆大", + "search_name": "胆大", + "variant": "normal", + "rarity": 4, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/401.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%83%86%E5%A4%A7" + }, + { + "id": 402, + "name": "U-35", + "search_name": "U-35", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/402.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-35" + }, + { + "id": 403, + "name": "格拉摩根", + "search_name": "格拉摩根", + "variant": "normal", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/403.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A0%BC%E6%8B%89%E6%91%A9%E6%A0%B9" + }, + { + "id": 404, + "name": "怨仇", + "search_name": "怨仇", + "variant": "normal", + "rarity": 5, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/404.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%80%A8%E4%BB%87" + }, + { + "id": 405, + "name": "乔治·莱格", + "search_name": "乔治·莱格", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/405.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B9%94%E6%B2%BB%C2%B7%E8%8E%B1%E6%A0%BC" + }, + { + "id": 406, + "name": "哈曼", + "search_name": "哈曼", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/406.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%93%88%E6%9B%BC" + }, + { + "id": 407, + "name": "吕特晏斯", + "search_name": "吕特晏斯", + "variant": "normal", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/407.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%90%95%E7%89%B9%E6%99%8F%E6%96%AF" + }, + { + "id": 408, + "name": "鲃鱼", + "search_name": "鲃鱼", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/408.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B2%83%E9%B1%BC" + }, + { + "id": 409, + "name": "新泽西", + "search_name": "新泽西", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/409.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%B0%E6%B3%BD%E8%A5%BF" + }, + { + "id": 410, + "name": "萨勒姆", + "search_name": "萨勒姆", + "variant": "normal", + "rarity": 6, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/410.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%90%A8%E5%8B%92%E5%A7%86" + }, + { + "id": 411, + "name": "黛朵", + "search_name": "黛朵", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/411.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%9B%E6%9C%B5" + }, + { + "id": 412, + "name": "堪培拉", + "search_name": "堪培拉", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/412.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A0%AA%E5%9F%B9%E6%8B%89" + }, + { + "id": 413, + "name": "加里波第", + "search_name": "加里波第", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/413.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E9%87%8C%E6%B3%A2%E7%AC%AC" + }, + { + "id": 414, + "name": "凯利", + "search_name": "凯利", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/414.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%87%AF%E5%88%A9" + }, + { + "id": 415, + "name": "英格兰", + "search_name": "英格兰", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/415.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8B%B1%E6%A0%BC%E5%85%B0" + }, + { + "id": 416, + "name": "47工程", + "search_name": "47工程", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/416.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/47%E5%B7%A5%E7%A8%8B" + }, + { + "id": 417, + "name": "可怖", + "search_name": "可怖", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/417.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%AF%E6%80%96" + }, + { + "id": 418, + "name": "阿金库尔", + "search_name": "阿金库尔", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/418.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E9%87%91%E5%BA%93%E5%B0%94" + }, + { + "id": 419, + "name": "桑提", + "search_name": "桑提", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/419.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A1%91%E6%8F%90" + }, + { + "id": 420, + "name": "亚尔古水手", + "search_name": "亚尔古水手", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/420.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BA%9A%E5%B0%94%E5%8F%A4%E6%B0%B4%E6%89%8B" + }, + { + "id": 421, + "name": "萨凡纳", + "search_name": "萨凡纳", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/421.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%90%A8%E5%87%A1%E7%BA%B3" + }, + { + "id": 422, + "name": "凤凰城", + "search_name": "凤凰城", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/422.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%87%A4%E5%87%B0%E5%9F%8E" + }, + { + "id": 423, + "name": "燕八哥", + "search_name": "燕八哥", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/423.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%87%95%E5%85%AB%E5%93%A5" + }, + { + "id": 424, + "name": "蒂默曼", + "search_name": "蒂默曼", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/424.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%92%82%E9%BB%98%E6%9B%BC" + }, + { + "id": 425, + "name": "史密斯", + "search_name": "史密斯", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/425.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%B2%E5%AF%86%E6%96%AF" + }, + { + "id": 426, + "name": "彼得·施特拉塞尔", + "search_name": "彼得·施特拉塞尔", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/426.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BD%BC%E5%BE%97%C2%B7%E6%96%BD%E7%89%B9%E6%8B%89%E5%A1%9E%E5%B0%94" + }, + { + "id": 427, + "name": "塞班", + "search_name": "塞班", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/427.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%9E%E7%8F%AD" + }, + { + "id": 428, + "name": "尼古拉斯", + "search_name": "尼古拉斯", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/428.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B0%BC%E5%8F%A4%E6%8B%89%E6%96%AF" + }, + { + "id": 429, + "name": "马伊·布雷泽", + "search_name": "马伊·布雷泽", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/429.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E4%BC%8A%C2%B7%E5%B8%83%E9%9B%B7%E6%B3%BD" + }, + { + "id": 430, + "name": "捷尔任斯基", + "search_name": "捷尔任斯基", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/430.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8D%B7%E5%B0%94%E4%BB%BB%E6%96%AF%E5%9F%BA" + }, + { + "id": 431, + "name": "什罗普郡", + "search_name": "什罗普郡", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/431.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BB%80%E7%BD%97%E6%99%AE%E9%83%A1" + }, + { + "id": 432, + "name": "波士顿", + "search_name": "波士顿", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/432.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%A2%E5%A3%AB%E9%A1%BF" + }, + { + "id": 433, + "name": "提康德罗加", + "search_name": "提康德罗加", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/433.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8F%90%E5%BA%B7%E5%BE%B7%E7%BD%97%E5%8A%A0" + }, + { + "id": 434, + "name": "亨廷顿", + "search_name": "亨廷顿", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/434.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BA%A8%E5%BB%B7%E9%A1%BF" + }, + { + "id": 435, + "name": "B65", + "search_name": "B65", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/435.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/B65" + }, + { + "id": 436, + "name": "十三号战舰", + "search_name": "十三号战舰", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/436.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%81%E4%B8%89%E5%8F%B7%E6%88%98%E8%88%B0" + }, + { + "id": 437, + "name": "鞍马", + "search_name": "鞍马", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/437.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9E%8D%E9%A9%AC" + }, + { + "id": 438, + "name": "梅肯", + "search_name": "梅肯", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/438.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A2%85%E8%82%AF" + }, + { + "id": 439, + "name": "冬月", + "search_name": "冬月", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/439.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%86%AC%E6%9C%88" + }, + { + "id": 440, + "name": "阿尔维塞·达莫斯托", + "search_name": "阿尔维塞·达莫斯托", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/440.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E5%B0%94%E7%BB%B4%E5%A1%9E%C2%B7%E8%BE%BE%E8%8E%AB%E6%96%AF%E6%89%98" + }, + { + "id": 441, + "name": "托戈", + "search_name": "托戈", + "variant": "normal", + "rarity": 4, + "ship_type": "ap", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/441.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ap.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%89%98%E6%88%88" + }, + { + "id": 442, + "name": "里昂", + "search_name": "里昂", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/442.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%87%8C%E6%98%82" + }, + { + "id": 443, + "name": "阿贺野", + "search_name": "阿贺野", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/443.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E8%B4%BA%E9%87%8E" + }, + { + "id": 444, + "name": "红色高加索", + "search_name": "红色高加索", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/444.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%A2%E8%89%B2%E9%AB%98%E5%8A%A0%E7%B4%A2" + }, + { + "id": 445, + "name": "哈尔福德", + "search_name": "哈尔福德", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/445.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%93%88%E5%B0%94%E7%A6%8F%E5%BE%B7" + }, + { + "id": 446, + "name": "狮(战列巡洋舰)", + "search_name": "狮(战列巡洋舰)", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/446.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%8B%AE(%E6%88%98%E5%88%97%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 447, + "name": "迪凯纳", + "search_name": "迪凯纳", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/447.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%BF%AA%E5%87%AF%E7%BA%B3" + }, + { + "id": 448, + "name": "弗兰德尔", + "search_name": "弗兰德尔", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/448.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BC%97%E5%85%B0%E5%BE%B7%E5%B0%94" + }, + { + "id": 449, + "name": "莫加多尔", + "search_name": "莫加多尔", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/449.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8E%AB%E5%8A%A0%E5%A4%9A%E5%B0%94" + }, + { + "id": 450, + "name": "L20", + "search_name": "L20", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/450.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/L20" + }, + { + "id": 451, + "name": "伊吹", + "search_name": "伊吹", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/451.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A%E5%90%B9" + }, + { + "id": 452, + "name": "萨里", + "search_name": "萨里", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/452.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%90%A8%E9%87%8C" + }, + { + "id": 453, + "name": "野分", + "search_name": "野分", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/453.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%87%8E%E5%88%86" + }, + { + "id": 454, + "name": "征服者", + "search_name": "征服者", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/454.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BE%81%E6%9C%8D%E8%80%85" + }, + { + "id": 455, + "name": "皇家方舟(R09)", + "search_name": "皇家方舟(R09)", + "variant": "normal", + "rarity": 6, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/455.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%9A%87%E5%AE%B6%E6%96%B9%E8%88%9F(R09)" + }, + { + "id": 456, + "name": "彼得罗巴甫洛夫斯克", + "search_name": "彼得罗巴甫洛夫斯克", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/456.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BD%BC%E5%BE%97%E7%BD%97%E5%B7%B4%E7%94%AB%E6%B4%9B%E5%A4%AB%E6%96%AF%E5%85%8B" + }, + { + "id": 457, + "name": "潮", + "search_name": "潮", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/457.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%BD%AE" + }, + { + "id": 458, + "name": "U-14", + "search_name": "U-14", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/458.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-14" + }, + { + "id": 459, + "name": "底特律", + "search_name": "底特律", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/459.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BA%95%E7%89%B9%E5%BE%8B" + }, + { + "id": 460, + "name": "宾夕法尼亚", + "search_name": "宾夕法尼亚", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/460.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%BE%E5%A4%95%E6%B3%95%E5%B0%BC%E4%BA%9A" + }, + { + "id": 461, + "name": "无敌", + "search_name": "无敌", + "variant": "normal", + "rarity": 6, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/461.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A0%E6%95%8C" + }, + { + "id": 462, + "name": "多摩", + "search_name": "多摩", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/462.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%9A%E6%91%A9" + }, + { + "id": 463, + "name": "鹰", + "search_name": "鹰", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/463.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B9%B0" + }, + { + "id": 464, + "name": "南达科他(BB-49)", + "search_name": "南达科他(BB-49)", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/464.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%97%E8%BE%BE%E7%A7%91%E4%BB%96(BB-49)" + }, + { + "id": 465, + "name": "爪哇", + "search_name": "爪哇", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/465.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%88%AA%E5%93%87" + }, + { + "id": 466, + "name": "1939战列舰", + "search_name": "1939战列舰", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "other", + "portrait": "assets/portraits/466.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/1939%E6%88%98%E5%88%97%E8%88%B0" + }, + { + "id": 467, + "name": "鞍山", + "search_name": "鞍山", + "variant": "normal", + "rarity": 4, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "china", + "portrait": "assets/portraits/467.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9E%8D%E5%B1%B1" + }, + { + "id": 468, + "name": "猎户座", + "search_name": "猎户座", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/468.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%8C%8E%E6%88%B7%E5%BA%A7" + }, + { + "id": 469, + "name": "本宁顿", + "search_name": "本宁顿", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/469.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9C%AC%E5%AE%81%E9%A1%BF" + }, + { + "id": 470, + "name": "甘比尔湾", + "search_name": "甘比尔湾", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/470.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%94%98%E6%AF%94%E5%B0%94%E6%B9%BE" + }, + { + "id": 471, + "name": "欧罗巴", + "search_name": "欧罗巴", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/471.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%AC%A7%E7%BD%97%E5%B7%B4" + }, + { + "id": 472, + "name": "霞飞", + "search_name": "霞飞", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/472.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9C%9E%E9%A3%9E" + }, + { + "id": 473, + "name": "阿非利加征服者西庇阿", + "search_name": "阿非利加征服者西庇阿", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/473.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E9%9D%9E%E5%88%A9%E5%8A%A0%E5%BE%81%E6%9C%8D%E8%80%85%E8%A5%BF%E5%BA%87%E9%98%BF" + }, + { + "id": 474, + "name": "72工程", + "search_name": "72工程", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/474.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/72%E5%B7%A5%E7%A8%8B" + }, + { + "id": 475, + "name": "U-2511", + "search_name": "U-2511", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/475.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-2511" + }, + { + "id": 476, + "name": "科顿艾尔", + "search_name": "科顿艾尔", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/476.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A7%91%E9%A1%BF%E8%89%BE%E5%B0%94" + }, + { + "id": 477, + "name": "马戈迪尼", + "search_name": "马戈迪尼", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/477.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E6%88%88%E8%BF%AA%E5%B0%BC" + }, + { + "id": 478, + "name": "阿方索十三世", + "search_name": "阿方索十三世", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "other", + "portrait": "assets/portraits/478.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E6%96%B9%E7%B4%A2%E5%8D%81%E4%B8%89%E4%B8%96" + }, + { + "id": 479, + "name": "桑普森", + "search_name": "桑普森", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/479.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A1%91%E6%99%AE%E6%A3%AE" + }, + { + "id": 480, + "name": "U-459", + "search_name": "U-459", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/480.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-459" + }, + { + "id": 481, + "name": "仁淀", + "search_name": "仁淀", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/481.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BB%81%E6%B7%80" + }, + { + "id": 482, + "name": "大淀(苍青幻影)", + "search_name": "大淀(苍青幻影)", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/482.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E6%B7%80(%E8%8B%8D%E9%9D%92%E5%B9%BB%E5%BD%B1)" + }, + { + "id": 483, + "name": "胜利", + "search_name": "胜利", + "variant": "normal", + "rarity": 5, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/483.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%83%9C%E5%88%A9" + }, + { + "id": 484, + "name": "安森", + "search_name": "安森", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/484.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%89%E6%A3%AE" + }, + { + "id": 485, + "name": "英格拉姆", + "search_name": "英格拉姆", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/485.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8B%B1%E6%A0%BC%E6%8B%89%E5%A7%86" + }, + { + "id": 486, + "name": "G15", + "search_name": "G15", + "variant": "normal", + "rarity": 5, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/486.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/G15" + }, + { + "id": 487, + "name": "五月二十五", + "search_name": "五月二十五", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/487.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BA%94%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94" + }, + { + "id": 488, + "name": "U-556", + "search_name": "U-556", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/488.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-556" + }, + { + "id": 489, + "name": "历战", + "search_name": "历战", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/489.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8E%86%E6%88%98" + }, + { + "id": 490, + "name": "克劳塞维茨", + "search_name": "克劳塞维茨", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/490.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%8B%E5%8A%B3%E5%A1%9E%E7%BB%B4%E8%8C%A8" + }, + { + "id": 491, + "name": "夏伯阳", + "search_name": "夏伯阳", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/491.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%8F%E4%BC%AF%E9%98%B3" + }, + { + "id": 492, + "name": "壮丽", + "search_name": "壮丽", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/492.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A3%AE%E4%B8%BD" + }, + { + "id": 493, + "name": "K-21", + "search_name": "K-21", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/493.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/K-21" + }, + { + "id": 494, + "name": "G6", + "search_name": "G6", + "variant": "normal", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/494.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/G6" + }, + { + "id": 495, + "name": "光荣(轻巡洋舰)", + "search_name": "光荣(轻巡洋舰)", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/495.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%89%E8%8D%A3(%E8%BD%BB%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 496, + "name": "诺福克(DL-1)", + "search_name": "诺福克(DL-1)", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/496.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%AF%BA%E7%A6%8F%E5%85%8B(DL-1)" + }, + { + "id": 497, + "name": "U-441", + "search_name": "U-441", + "variant": "normal", + "rarity": 3, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/497.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-441" + }, + { + "id": 498, + "name": "复仇", + "search_name": "复仇", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/498.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%8D%E4%BB%87" + }, + { + "id": 499, + "name": "克里蒙梭", + "search_name": "克里蒙梭", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/499.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%8B%E9%87%8C%E8%92%99%E6%A2%AD" + }, + { + "id": 500, + "name": "伏尔铿", + "search_name": "伏尔铿", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/500.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8F%E5%B0%94%E9%93%BF" + }, + { + "id": 501, + "name": "拉弗雷", + "search_name": "拉弗雷", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/501.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8B%89%E5%BC%97%E9%9B%B7" + }, + { + "id": 502, + "name": "济南", + "search_name": "济南", + "variant": "normal", + "rarity": 5, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "china", + "portrait": "assets/portraits/502.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B5%8E%E5%8D%97" + }, + { + "id": 503, + "name": "T-23", + "search_name": "T-23", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/503.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/T-23" + }, + { + "id": 504, + "name": "费城", + "search_name": "费城", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/504.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B4%B9%E5%9F%8E" + }, + { + "id": 505, + "name": "雉", + "search_name": "雉", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/505.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9B%89" + }, + { + "id": 506, + "name": "1938(I)", + "search_name": "1938(I)", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/506.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/1938(I)" + }, + { + "id": 507, + "name": "艾斯沃尔德", + "search_name": "艾斯沃尔德", + "variant": "normal", + "rarity": 3, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/507.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%89%BE%E6%96%AF%E6%B2%83%E5%B0%94%E5%BE%B7" + }, + { + "id": 508, + "name": "安萨尔多", + "search_name": "安萨尔多", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/508.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%89%E8%90%A8%E5%B0%94%E5%A4%9A" + }, + { + "id": 509, + "name": "谦逊", + "search_name": "谦逊", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/509.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B0%A6%E9%80%8A" + }, + { + "id": 510, + "name": "G14", + "search_name": "G14", + "variant": "normal", + "rarity": 6, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/510.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/G14" + }, + { + "id": 511, + "name": "德文郡", + "search_name": "德文郡", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/511.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BE%B7%E6%96%87%E9%83%A1" + }, + { + "id": 512, + "name": "科伦坡", + "search_name": "科伦坡", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/512.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A7%91%E4%BC%A6%E5%9D%A1" + }, + { + "id": 513, + "name": "勇猛", + "search_name": "勇猛", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/513.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8B%87%E7%8C%9B" + }, + { + "id": 514, + "name": "近江", + "search_name": "近江", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/514.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%BF%91%E6%B1%9F" + }, + { + "id": 515, + "name": "伏罗希洛夫", + "search_name": "伏罗希洛夫", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/515.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8F%E7%BD%97%E5%B8%8C%E6%B4%9B%E5%A4%AB" + }, + { + "id": 516, + "name": "日丹诺夫", + "search_name": "日丹诺夫", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/516.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A5%E4%B8%B9%E8%AF%BA%E5%A4%AB" + }, + { + "id": 517, + "name": "吕贝克", + "search_name": "吕贝克", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/517.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%90%95%E8%B4%9D%E5%85%8B" + }, + { + "id": 518, + "name": "IIIA", + "search_name": "IIIA", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/518.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/IIIA" + }, + { + "id": 519, + "name": "T.995", + "search_name": "T.995", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/519.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/T.995" + }, + { + "id": 520, + "name": "蒙大拿", + "search_name": "蒙大拿", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/520.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%92%99%E5%A4%A7%E6%8B%BF" + }, + { + "id": 521, + "name": "1913战巡", + "search_name": "1913战巡", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "china", + "portrait": "assets/portraits/521.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/1913%E6%88%98%E5%B7%A1" + }, + { + "id": 522, + "name": "法戈", + "search_name": "法戈", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/522.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%95%E6%88%88" + }, + { + "id": 523, + "name": "亚拉巴马", + "search_name": "亚拉巴马", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/523.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BA%9A%E6%8B%89%E5%B7%B4%E9%A9%AC" + }, + { + "id": 524, + "name": "夏威夷", + "search_name": "夏威夷", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/524.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%8F%E5%A8%81%E5%A4%B7" + }, + { + "id": 525, + "name": "长波", + "search_name": "长波", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/525.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%95%BF%E6%B3%A2" + }, + { + "id": 526, + "name": "朱诺(CL-119)", + "search_name": "朱诺(CL-119)", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/526.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9C%B1%E8%AF%BA(CL-119)" + }, + { + "id": 527, + "name": "CNT巡洋舰", + "search_name": "CNT巡洋舰", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/527.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/CNT%E5%B7%A1%E6%B4%8B%E8%88%B0" + }, + { + "id": 528, + "name": "芝加哥(CA-136)", + "search_name": "芝加哥(CA-136)", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/528.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8A%9D%E5%8A%A0%E5%93%A5(CA-136)" + }, + { + "id": 529, + "name": "花信风", + "search_name": "花信风", + "variant": "normal", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/529.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8A%B1%E4%BF%A1%E9%A3%8E" + }, + { + "id": 530, + "name": "M-296", + "search_name": "M-296", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/530.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/M-296" + }, + { + "id": 531, + "name": "墨尔波墨涅", + "search_name": "墨尔波墨涅", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/531.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A2%A8%E5%B0%94%E6%B3%A2%E5%A2%A8%E6%B6%85" + }, + { + "id": 532, + "name": "但丁", + "search_name": "但丁", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/532.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BD%86%E4%B8%81" + }, + { + "id": 533, + "name": "格罗兹尼", + "search_name": "格罗兹尼", + "variant": "normal", + "rarity": 5, + "ship_type": "cg", + "size_class": "medium", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/533.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A0%BC%E7%BD%97%E5%85%B9%E5%B0%BC" + }, + { + "id": 534, + "name": "24工程", + "search_name": "24工程", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/534.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/24%E5%B7%A5%E7%A8%8B" + }, + { + "id": 535, + "name": "Z32", + "search_name": "Z32", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/535.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z32" + }, + { + "id": 536, + "name": "卡伯特", + "search_name": "卡伯特", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/536.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E4%BC%AF%E7%89%B9" + }, + { + "id": 537, + "name": "波拉", + "search_name": "波拉", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/537.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%A2%E6%8B%89" + }, + { + "id": 538, + "name": "伊-25", + "search_name": "伊-25", + "variant": "normal", + "rarity": 3, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/538.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A-25" + }, + { + "id": 539, + "name": "SKR-6", + "search_name": "SKR-6", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/539.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/SKR-6" + }, + { + "id": 540, + "name": "伊兹梅尔", + "search_name": "伊兹梅尔", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/540.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A%E5%85%B9%E6%A2%85%E5%B0%94" + }, + { + "id": 541, + "name": "火力", + "search_name": "火力", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/541.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%81%AB%E5%8A%9B" + }, + { + "id": 542, + "name": "卡律布狄斯", + "search_name": "卡律布狄斯", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/542.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E5%BE%8B%E5%B8%83%E7%8B%84%E6%96%AF" + }, + { + "id": 543, + "name": "Z2", + "search_name": "Z2", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/543.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z2" + }, + { + "id": 544, + "name": "丛云", + "search_name": "丛云", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/544.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%9B%E4%BA%91" + }, + { + "id": 545, + "name": "威悉河", + "search_name": "威悉河", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/545.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E6%82%89%E6%B2%B3" + }, + { + "id": 546, + "name": "德意志(训练巡洋舰)", + "search_name": "德意志(训练巡洋舰)", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/546.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BE%B7%E6%84%8F%E5%BF%97(%E8%AE%AD%E7%BB%83%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 547, + "name": "勃艮第", + "search_name": "勃艮第", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/547.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8B%83%E8%89%AE%E7%AC%AC" + }, + { + "id": 548, + "name": "龙凤", + "search_name": "龙凤", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/548.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BE%99%E5%87%A4" + }, + { + "id": 549, + "name": "岛风(峰风型驱逐舰)", + "search_name": "岛风(峰风型驱逐舰)", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/549.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B2%9B%E9%A3%8E(%E5%B3%B0%E9%A3%8E%E5%9E%8B%E9%A9%B1%E9%80%90%E8%88%B0)" + }, + { + "id": 550, + "name": "赫尔", + "search_name": "赫尔", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/550.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B5%AB%E5%B0%94" + }, + { + "id": 551, + "name": "本明", + "search_name": "本明", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/551.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9C%AC%E6%98%8E" + }, + { + "id": 552, + "name": "絮弗伦", + "search_name": "絮弗伦", + "variant": "normal", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/552.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%B5%AE%E5%BC%97%E4%BC%A6" + }, + { + "id": 553, + "name": "长田", + "search_name": "长田", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/553.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%95%BF%E7%94%B0" + }, + { + "id": 554, + "name": "戈里齐亚", + "search_name": "戈里齐亚", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/554.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%88%88%E9%87%8C%E9%BD%90%E4%BA%9A" + }, + { + "id": 555, + "name": "玛丽女王", + "search_name": "玛丽女王", + "variant": "normal", + "rarity": 3, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/555.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%8E%9B%E4%B8%BD%E5%A5%B3%E7%8E%8B" + }, + { + "id": 556, + "name": "若月", + "search_name": "若月", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/556.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8B%A5%E6%9C%88" + }, + { + "id": 557, + "name": "初春", + "search_name": "初春", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/557.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%9D%E6%98%A5" + }, + { + "id": 558, + "name": "芝加哥(CA-29)", + "search_name": "芝加哥(CA-29)", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/558.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8A%9D%E5%8A%A0%E5%93%A5(CA-29)" + }, + { + "id": 559, + "name": "不惧(防空导弹驱逐舰)", + "search_name": "不惧(防空导弹驱逐舰)", + "variant": "normal", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/559.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%8D%E6%83%A7(%E9%98%B2%E7%A9%BA%E5%AF%BC%E5%BC%B9%E9%A9%B1%E9%80%90%E8%88%B0)" + }, + { + "id": 560, + "name": "石勒苏益格-荷尔施泰因", + "search_name": "石勒苏益格-荷尔施泰因", + "variant": "normal", + "rarity": 3, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/560.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%9F%B3%E5%8B%92%E8%8B%8F%E7%9B%8A%E6%A0%BC-%E8%8D%B7%E5%B0%94%E6%96%BD%E6%B3%B0%E5%9B%A0" + }, + { + "id": 561, + "name": "朱利奥·格马尼库斯", + "search_name": "朱利奥·格马尼库斯", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/561.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9C%B1%E5%88%A9%E5%A5%A5%C2%B7%E6%A0%BC%E9%A9%AC%E5%B0%BC%E5%BA%93%E6%96%AF" + }, + { + "id": 562, + "name": "不屈", + "search_name": "不屈", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/562.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%8D%E5%B1%88" + }, + { + "id": 563, + "name": "康沃尔", + "search_name": "康沃尔", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/563.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BA%B7%E6%B2%83%E5%B0%94" + }, + { + "id": 564, + "name": "Z60", + "search_name": "Z60", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/564.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z60" + }, + { + "id": 565, + "name": "塞瓦斯托波尔(战列巡洋舰)", + "search_name": "塞瓦斯托波尔(战列巡洋舰)", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/565.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%9E%E7%93%A6%E6%96%AF%E6%89%98%E6%B3%A2%E5%B0%94(%E6%88%98%E5%88%97%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 566, + "name": "风暴", + "search_name": "风暴", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/566.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A3%8E%E6%9A%B4" + }, + { + "id": 567, + "name": "科芒斯曼特湾", + "search_name": "科芒斯曼特湾", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/567.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A7%91%E8%8A%92%E6%96%AF%E6%9B%BC%E7%89%B9%E6%B9%BE" + }, + { + "id": 568, + "name": "苏尔特元帅", + "search_name": "苏尔特元帅", + "variant": "normal", + "rarity": 3, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/568.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8B%8F%E5%B0%94%E7%89%B9%E5%85%83%E5%B8%85" + }, + { + "id": 569, + "name": "布勃诺夫方案", + "search_name": "布勃诺夫方案", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/569.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E5%8B%83%E8%AF%BA%E5%A4%AB%E6%96%B9%E6%A1%88" + }, + { + "id": 570, + "name": "千岁", + "search_name": "千岁", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/570.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%83%E5%B2%81" + }, + { + "id": 571, + "name": "文森斯", + "search_name": "文森斯", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/571.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%87%E6%A3%AE%E6%96%AF" + }, + { + "id": 572, + "name": "骏河", + "search_name": "骏河", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/572.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%AA%8F%E6%B2%B3" + }, + { + "id": 573, + "name": "71工程", + "search_name": "71工程", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/573.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/71%E5%B7%A5%E7%A8%8B" + }, + { + "id": 574, + "name": "德克萨斯", + "search_name": "德克萨斯", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/574.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BE%B7%E5%85%8B%E8%90%A8%E6%96%AF" + }, + { + "id": 575, + "name": "威武", + "search_name": "威武", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/575.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E6%AD%A6" + }, + { + "id": 576, + "name": "中途岛", + "search_name": "中途岛", + "variant": "normal", + "rarity": 6, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/576.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%AD%E9%80%94%E5%B2%9B" + }, + { + "id": 577, + "name": "水中仙女", + "search_name": "水中仙女", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/577.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B0%B4%E4%B8%AD%E4%BB%99%E5%A5%B3" + }, + { + "id": 578, + "name": "里维斯", + "search_name": "里维斯", + "variant": "normal", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/578.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%87%8C%E7%BB%B4%E6%96%AF" + }, + { + "id": 579, + "name": "伊-201", + "search_name": "伊-201", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/579.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A-201" + }, + { + "id": 580, + "name": "特伦托", + "search_name": "特伦托", + "variant": "normal", + "rarity": 3, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/580.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%89%B9%E4%BC%A6%E6%89%98" + }, + { + "id": 581, + "name": "塞瓦斯托波尔(导弹巡洋舰)", + "search_name": "塞瓦斯托波尔(导弹巡洋舰)", + "variant": "normal", + "rarity": 5, + "ship_type": "cg", + "size_class": "medium", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/581.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%9E%E7%93%A6%E6%96%AF%E6%89%98%E6%B3%A2%E5%B0%94(%E5%AF%BC%E5%BC%B9%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 582, + "name": "H43", + "search_name": "H43", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/582.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/H43" + }, + { + "id": 583, + "name": "卡拉乔洛", + "search_name": "卡拉乔洛", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/583.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E6%8B%89%E4%B9%94%E6%B4%9B" + }, + { + "id": 584, + "name": "IVS轻巡洋舰", + "search_name": "IVS轻巡洋舰", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/584.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/IVS%E8%BD%BB%E5%B7%A1%E6%B4%8B%E8%88%B0" + }, + { + "id": 585, + "name": "鳞鲀", + "search_name": "鳞鲀", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/585.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B3%9E%E9%B2%80" + }, + { + "id": 586, + "name": "AIII", + "search_name": "AIII", + "variant": "normal", + "rarity": 6, + "ship_type": "bbv", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/586.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bbv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/AIII" + }, + { + "id": 587, + "name": "考彭斯", + "search_name": "考彭斯", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/587.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%80%83%E5%BD%AD%E6%96%AF" + }, + { + "id": 588, + "name": "422", + "search_name": "422", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/588.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/422" + }, + { + "id": 589, + "name": "休·W·哈德利", + "search_name": "休·W·哈德利", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/589.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%91%C2%B7W%C2%B7%E5%93%88%E5%BE%B7%E5%88%A9" + }, + { + "id": 590, + "name": "金伯恩", + "search_name": "金伯恩", + "variant": "normal", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/590.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%87%91%E4%BC%AF%E6%81%A9" + }, + { + "id": 591, + "name": "加尔各答", + "search_name": "加尔各答", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/591.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E5%B0%94%E5%90%84%E7%AD%94" + }, + { + "id": 592, + "name": "豹", + "search_name": "豹", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/592.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B1%B9" + }, + { + "id": 593, + "name": "夕雾", + "search_name": "夕雾", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/593.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%95%E9%9B%BE" + }, + { + "id": 594, + "name": "黄蜂(CV-18)", + "search_name": "黄蜂(CV-18)", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/594.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%84%E8%9C%82(CV-18)" + }, + { + "id": 595, + "name": "东风", + "search_name": "东风", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/595.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%9C%E9%A3%8E" + }, + { + "id": 596, + "name": "九江", + "search_name": "九江", + "variant": "normal", + "rarity": 4, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "china", + "portrait": "assets/portraits/596.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B9%9D%E6%B1%9F" + }, + { + "id": 597, + "name": "海洋", + "search_name": "海洋", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/597.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B5%B7%E6%B4%8B" + }, + { + "id": 598, + "name": "梅雷迪斯", + "search_name": "梅雷迪斯", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/598.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A2%85%E9%9B%B7%E8%BF%AA%E6%96%AF" + }, + { + "id": 599, + "name": "303", + "search_name": "303", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/599.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/303" + }, + { + "id": 600, + "name": "U-4501", + "search_name": "U-4501", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/600.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-4501" + }, + { + "id": 601, + "name": "351", + "search_name": "351", + "variant": "normal", + "rarity": 5, + "ship_type": "ssg", + "size_class": "small", + "role_class": "main_force", + "country": "china", + "portrait": "assets/portraits/601.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ssg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/351" + }, + { + "id": 602, + "name": "密西西比", + "search_name": "密西西比", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/602.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AF%86%E8%A5%BF%E8%A5%BF%E6%AF%94" + }, + { + "id": 603, + "name": "凯尔森", + "search_name": "凯尔森", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/603.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%87%AF%E5%B0%94%E6%A3%AE" + }, + { + "id": 604, + "name": "大胆", + "search_name": "大胆", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/604.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E8%83%86" + }, + { + "id": 605, + "name": "卡萨诺方案", + "search_name": "卡萨诺方案", + "variant": "normal", + "rarity": 6, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/605.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E8%90%A8%E8%AF%BA%E6%96%B9%E6%A1%88" + }, + { + "id": 606, + "name": "汉堡", + "search_name": "汉堡", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/606.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B1%89%E5%A0%A1" + }, + { + "id": 607, + "name": "航空兵", + "search_name": "航空兵", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/607.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%88%AA%E7%A9%BA%E5%85%B5" + }, + { + "id": 608, + "name": "支持者", + "search_name": "支持者", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/608.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%94%AF%E6%8C%81%E8%80%85" + }, + { + "id": 609, + "name": "香格里拉", + "search_name": "香格里拉", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/609.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A6%99%E6%A0%BC%E9%87%8C%E6%8B%89" + }, + { + "id": 610, + "name": "激流", + "search_name": "激流", + "variant": "normal", + "rarity": 3, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/610.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%BF%80%E6%B5%81" + }, + { + "id": 611, + "name": "迪盖·特鲁安", + "search_name": "迪盖·特鲁安", + "variant": "normal", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/611.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%BF%AA%E7%9B%96%C2%B7%E7%89%B9%E9%B2%81%E5%AE%89" + }, + { + "id": 612, + "name": "巴格利", + "search_name": "巴格利", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/612.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B7%B4%E6%A0%BC%E5%88%A9" + }, + { + "id": 613, + "name": "武藏", + "search_name": "武藏", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/613.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%AD%A6%E8%97%8F" + }, + { + "id": 614, + "name": "布列塔尼", + "search_name": "布列塔尼", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/614.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E5%88%97%E5%A1%94%E5%B0%BC" + }, + { + "id": 615, + "name": "冲锋", + "search_name": "冲锋", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/615.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%86%B2%E9%94%8B" + }, + { + "id": 616, + "name": "狭雾", + "search_name": "狭雾", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/616.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%8B%AD%E9%9B%BE" + }, + { + "id": 617, + "name": "南京", + "search_name": "南京", + "variant": "normal", + "rarity": 5, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "china", + "portrait": "assets/portraits/617.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%97%E4%BA%AC" + }, + { + "id": 618, + "name": "米切尔", + "search_name": "米切尔", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/618.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%B1%B3%E5%88%87%E5%B0%94" + }, + { + "id": 619, + "name": "罗斯福", + "search_name": "罗斯福", + "variant": "normal", + "rarity": 6, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/619.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BD%97%E6%96%AF%E7%A6%8F" + }, + { + "id": 620, + "name": "铁公爵", + "search_name": "铁公爵", + "variant": "normal", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/620.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%93%81%E5%85%AC%E7%88%B5" + }, + { + "id": 621, + "name": "长矛", + "search_name": "长矛", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/621.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%95%BF%E7%9F%9B" + }, + { + "id": 622, + "name": "杜布雷", + "search_name": "杜布雷", + "variant": "normal", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/622.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9D%9C%E5%B8%83%E9%9B%B7" + }, + { + "id": 623, + "name": "鲁莽", + "search_name": "鲁莽", + "variant": "normal", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/623.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B2%81%E8%8E%BD" + }, + { + "id": 624, + "name": "堡垒", + "search_name": "堡垒", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/624.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A0%A1%E5%9E%92" + }, + { + "id": 625, + "name": "卡萨尔", + "search_name": "卡萨尔", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/625.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E8%90%A8%E5%B0%94" + }, + { + "id": 626, + "name": "伊-17", + "search_name": "伊-17", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/626.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A-17" + }, + { + "id": 627, + "name": "奥里斯坎尼", + "search_name": "奥里斯坎尼", + "variant": "normal", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/627.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A5%A5%E9%87%8C%E6%96%AF%E5%9D%8E%E5%B0%BC" + }, + { + "id": 628, + "name": "长岛", + "search_name": "长岛", + "variant": "normal", + "rarity": 3, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/628.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%95%BF%E5%B2%9B" + }, + { + "id": 629, + "name": "桑加蒙", + "search_name": "桑加蒙", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/629.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A1%91%E5%8A%A0%E8%92%99" + }, + { + "id": 630, + "name": "U-3008", + "search_name": "U-3008", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/630.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-3008" + }, + { + "id": 631, + "name": "Kw45", + "search_name": "Kw45", + "variant": "normal", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/631.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Kw45" + }, + { + "id": 632, + "name": "海梅一世", + "search_name": "海梅一世", + "variant": "normal", + "rarity": 3, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "other", + "portrait": "assets/portraits/632.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B5%B7%E6%A2%85%E4%B8%80%E4%B8%96" + }, + { + "id": 633, + "name": "S-49", + "search_name": "S-49", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/633.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/S-49" + }, + { + "id": 634, + "name": "自豪", + "search_name": "自豪", + "variant": "normal", + "rarity": 4, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/634.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%87%AA%E8%B1%AA" + }, + { + "id": 635, + "name": "10581工程", + "search_name": "10581工程", + "variant": "normal", + "rarity": 6, + "ship_type": "bbv", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/635.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bbv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/10581%E5%B7%A5%E7%A8%8B" + }, + { + "id": 636, + "name": "活泼(导弹驱逐舰)", + "search_name": "活泼(导弹驱逐舰)", + "variant": "normal", + "rarity": 4, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/636.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B4%BB%E6%B3%BC(%E5%AF%BC%E5%BC%B9%E9%A9%B1%E9%80%90%E8%88%B0)" + }, + { + "id": 637, + "name": "伊-400", + "search_name": "伊-400", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/637.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A-400" + }, + { + "id": 638, + "name": "虎(驱逐舰)", + "search_name": "虎(驱逐舰)", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/638.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%99%8E(%E9%A9%B1%E9%80%90%E8%88%B0)" + }, + { + "id": 639, + "name": "阿尔戈", + "search_name": "阿尔戈", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/639.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E5%B0%94%E6%88%88" + }, + { + "id": 640, + "name": "考文垂", + "search_name": "考文垂", + "variant": "normal", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/640.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%80%83%E6%96%87%E5%9E%82" + }, + { + "id": 641, + "name": "21工程", + "search_name": "21工程", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/641.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/21%E5%B7%A5%E7%A8%8B" + }, + { + "id": 642, + "name": "圣洛", + "search_name": "圣洛", + "variant": "normal", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/642.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%A3%E6%B4%9B" + }, + { + "id": 643, + "name": "活泼(驱逐舰)", + "search_name": "活泼(驱逐舰)", + "variant": "normal", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/643.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B4%BB%E6%B3%BC(%E9%A9%B1%E9%80%90%E8%88%B0)" + }, + { + "id": 644, + "name": "伊丽莎白女王(CVA-01)", + "search_name": "伊丽莎白女王(CVA-01)", + "variant": "normal", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/644.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A%E4%B8%BD%E8%8E%8E%E7%99%BD%E5%A5%B3%E7%8E%8B(CVA-01)" + }, + { + "id": 645, + "name": "U-103", + "search_name": "U-103", + "variant": "normal", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/645.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-103" + }, + { + "id": 646, + "name": "阿蒂利奥·雷戈洛", + "search_name": "阿蒂利奥·雷戈洛", + "variant": "normal", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/646.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E8%92%82%E5%88%A9%E5%A5%A5%C2%B7%E9%9B%B7%E6%88%88%E6%B4%9B" + }, + { + "id": 647, + "name": "矢矧", + "search_name": "矢矧", + "variant": "normal", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/647.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%9F%A2%E7%9F%A7" + }, + { + "id": 648, + "name": "阿尔汉格尔斯克", + "search_name": "阿尔汉格尔斯克", + "variant": "normal", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/648.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E5%B0%94%E6%B1%89%E6%A0%BC%E5%B0%94%E6%96%AF%E5%85%8B" + }, + { + "id": 649, + "name": "U-177", + "search_name": "U-177", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/649.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-177" + }, + { + "id": 650, + "name": "马丁", + "search_name": "马丁", + "variant": "normal", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/650.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E4%B8%81" + }, + { + "id": 651, + "name": "卡萨比安卡", + "search_name": "卡萨比安卡", + "variant": "normal", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/651.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E8%90%A8%E6%AF%94%E5%AE%89%E5%8D%A1" + }, + { + "id": 1001, + "name": "胡德·改", + "search_name": "胡德", + "variant": "refit", + "rarity": 6, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1001.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%83%A1%E5%BE%B7" + }, + { + "id": 1002, + "name": "扶桑·改", + "search_name": "扶桑", + "variant": "refit", + "rarity": 4, + "ship_type": "bbv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1002.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bbv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%89%B6%E6%A1%91" + }, + { + "id": 1003, + "name": "山城·改", + "search_name": "山城", + "variant": "refit", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1003.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B1%B1%E5%9F%8E" + }, + { + "id": 1004, + "name": "伊势·改", + "search_name": "伊势", + "variant": "refit", + "rarity": 4, + "ship_type": "bbv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1004.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bbv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A%E5%8A%BF" + }, + { + "id": 1005, + "name": "日向·改", + "search_name": "日向", + "variant": "refit", + "rarity": 4, + "ship_type": "bbv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1005.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bbv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A5%E5%90%91" + }, + { + "id": 1006, + "name": "俾斯麦·改", + "search_name": "俾斯麦", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/1006.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BF%BE%E6%96%AF%E9%BA%A6" + }, + { + "id": 1007, + "name": "提尔比茨·改", + "search_name": "提尔比茨", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/1007.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8F%90%E5%B0%94%E6%AF%94%E8%8C%A8" + }, + { + "id": 1008, + "name": "纳尔逊·改", + "search_name": "纳尔逊", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1008.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%B3%E5%B0%94%E9%80%8A" + }, + { + "id": 1009, + "name": "罗德尼·改", + "search_name": "罗德尼", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1009.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BD%97%E5%BE%B7%E5%B0%BC" + }, + { + "id": 1010, + "name": "威尔士亲王·改", + "search_name": "威尔士亲王", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1010.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E5%B0%94%E5%A3%AB%E4%BA%B2%E7%8E%8B" + }, + { + "id": 1011, + "name": "内华达·改", + "search_name": "内华达", + "variant": "refit", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1011.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%86%85%E5%8D%8E%E8%BE%BE" + }, + { + "id": 1012, + "name": "俄克拉荷马·改", + "search_name": "俄克拉荷马", + "variant": "refit", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1012.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BF%84%E5%85%8B%E6%8B%89%E8%8D%B7%E9%A9%AC" + }, + { + "id": 1013, + "name": "安德烈亚·多利亚·改", + "search_name": "安德烈亚·多利亚", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/1013.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%89%E5%BE%B7%E7%83%88%E4%BA%9A%C2%B7%E5%A4%9A%E5%88%A9%E4%BA%9A" + }, + { + "id": 1014, + "name": "金刚·改", + "search_name": "金刚", + "variant": "refit", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1014.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%87%91%E5%88%9A" + }, + { + "id": 1018, + "name": "声望·改", + "search_name": "声望", + "variant": "refit", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1018.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A3%B0%E6%9C%9B" + }, + { + "id": 1019, + "name": "反击·改", + "search_name": "反击", + "variant": "refit", + "rarity": 4, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1019.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%8D%E5%87%BB" + }, + { + "id": 1020, + "name": "阿拉斯加·改", + "search_name": "阿拉斯加", + "variant": "refit", + "rarity": 6, + "ship_type": "cbg", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1020.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cbg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E6%8B%89%E6%96%AF%E5%8A%A0" + }, + { + "id": 1021, + "name": "关岛·改", + "search_name": "关岛", + "variant": "refit", + "rarity": 6, + "ship_type": "cbg", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1021.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cbg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%B3%E5%B2%9B" + }, + { + "id": 1022, + "name": "赤城·改", + "search_name": "赤城", + "variant": "refit", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1022.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B5%A4%E5%9F%8E" + }, + { + "id": 1023, + "name": "加贺·改", + "search_name": "加贺", + "variant": "refit", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1023.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E8%B4%BA" + }, + { + "id": 1024, + "name": "祥凤·改", + "search_name": "祥凤", + "variant": "refit", + "rarity": 5, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1024.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A5%A5%E5%87%A4" + }, + { + "id": 1025, + "name": "瑞凤·改", + "search_name": "瑞凤", + "variant": "refit", + "rarity": 5, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1025.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%91%9E%E5%87%A4" + }, + { + "id": 1026, + "name": "百眼巨人·改", + "search_name": "百眼巨人", + "variant": "refit", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1026.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%99%BE%E7%9C%BC%E5%B7%A8%E4%BA%BA" + }, + { + "id": 1027, + "name": "兰利·改", + "search_name": "兰利", + "variant": "refit", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1027.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%B0%E5%88%A9" + }, + { + "id": 1028, + "name": "突击者·改", + "search_name": "突击者", + "variant": "refit", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1028.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%AA%81%E5%87%BB%E8%80%85" + }, + { + "id": 1029, + "name": "列克星敦(CV-2)·改", + "search_name": "列克星敦(CV-2)", + "variant": "refit", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1029.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%97%E5%85%8B%E6%98%9F%E6%95%A6(CV-2)" + }, + { + "id": 1030, + "name": "萨拉托加·改", + "search_name": "萨拉托加", + "variant": "refit", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1030.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%90%A8%E6%8B%89%E6%89%98%E5%8A%A0" + }, + { + "id": 1031, + "name": "大黄蜂·改", + "search_name": "大黄蜂", + "variant": "refit", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1031.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E9%BB%84%E8%9C%82" + }, + { + "id": 1032, + "name": "高雄·改", + "search_name": "高雄", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1032.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%AB%98%E9%9B%84" + }, + { + "id": 1033, + "name": "爱宕·改", + "search_name": "爱宕", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1033.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%88%B1%E5%AE%95" + }, + { + "id": 1034, + "name": "摩耶·改", + "search_name": "摩耶", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1034.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%91%A9%E8%80%B6" + }, + { + "id": 1035, + "name": "鸟海·改", + "search_name": "鸟海", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1035.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B8%9F%E6%B5%B7" + }, + { + "id": 1036, + "name": "希佩尔海军上将·改", + "search_name": "希佩尔海军上将", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1036.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%8C%E4%BD%A9%E5%B0%94%E6%B5%B7%E5%86%9B%E4%B8%8A%E5%B0%86" + }, + { + "id": 1037, + "name": "布吕歇尔(重巡洋舰)·改", + "search_name": "布吕歇尔(重巡洋舰)", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1037.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E5%90%95%E6%AD%87%E5%B0%94(%E9%87%8D%E5%B7%A1%E6%B4%8B%E8%88%B0)" + }, + { + "id": 1038, + "name": "欧根亲王·改", + "search_name": "欧根亲王", + "variant": "refit", + "rarity": 6, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1038.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%AC%A7%E6%A0%B9%E4%BA%B2%E7%8E%8B" + }, + { + "id": 1039, + "name": "威奇塔·改", + "search_name": "威奇塔", + "variant": "refit", + "rarity": 5, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1039.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E5%A5%87%E5%A1%94" + }, + { + "id": 1040, + "name": "昆西·改", + "search_name": "昆西", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1040.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%98%86%E8%A5%BF" + }, + { + "id": 1041, + "name": "天龙·改", + "search_name": "天龙", + "variant": "refit", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1041.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E9%BE%99" + }, + { + "id": 1042, + "name": "龙田·改", + "search_name": "龙田", + "variant": "refit", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1042.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BE%99%E7%94%B0" + }, + { + "id": 1043, + "name": "北上·改", + "search_name": "北上", + "variant": "refit", + "rarity": 5, + "ship_type": "clt", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1043.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/clt.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8C%97%E4%B8%8A" + }, + { + "id": 1044, + "name": "大井·改", + "search_name": "大井", + "variant": "refit", + "rarity": 5, + "ship_type": "clt", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1044.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/clt.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E4%BA%95" + }, + { + "id": 1045, + "name": "五十铃·改", + "search_name": "五十铃", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1045.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BA%94%E5%8D%81%E9%93%83" + }, + { + "id": 1046, + "name": "夕张·改", + "search_name": "夕张", + "variant": "refit", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1046.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%95%E5%BC%A0" + }, + { + "id": 1047, + "name": "柯尼斯堡·改", + "search_name": "柯尼斯堡", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1047.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9F%AF%E5%B0%BC%E6%96%AF%E5%A0%A1" + }, + { + "id": 1048, + "name": "卡尔斯鲁厄·改", + "search_name": "卡尔斯鲁厄", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1048.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E5%B0%94%E6%96%AF%E9%B2%81%E5%8E%84" + }, + { + "id": 1049, + "name": "科隆·改", + "search_name": "科隆", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1049.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A7%91%E9%9A%86" + }, + { + "id": 1050, + "name": "天狼星·改", + "search_name": "天狼星", + "variant": "refit", + "rarity": 6, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1050.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E7%8B%BC%E6%98%9F" + }, + { + "id": 1054, + "name": "重庆", + "search_name": "重庆", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/1054.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9B%99%E5%85%89%E5%A5%B3%E7%A5%9E" + }, + { + "id": 1055, + "name": "奥马哈·改", + "search_name": "奥马哈", + "variant": "refit", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1055.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A5%A5%E9%A9%AC%E5%93%88" + }, + { + "id": 1056, + "name": "亚特兰大·改", + "search_name": "亚特兰大", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1056.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BA%9A%E7%89%B9%E5%85%B0%E5%A4%A7" + }, + { + "id": 1057, + "name": "朱诺(CL-52)·改", + "search_name": "朱诺(CL-52)", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1057.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9C%B1%E8%AF%BA(CL-52)" + }, + { + "id": 1058, + "name": "奥希金斯", + "search_name": "奥希金斯", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/1058.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E9%B2%81%E5%85%8B%E6%9E%97" + }, + { + "id": 1059, + "name": "海伦娜·改", + "search_name": "海伦娜", + "variant": "refit", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1059.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B5%B7%E4%BC%A6%E5%A8%9C" + }, + { + "id": 1060, + "name": "宁海·改", + "search_name": "宁海", + "variant": "refit", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/1060.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%81%E6%B5%B7" + }, + { + "id": 1061, + "name": "平海·改", + "search_name": "平海", + "variant": "refit", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/1061.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B9%B3%E6%B5%B7" + }, + { + "id": 1062, + "name": "罗伯茨·改", + "search_name": "罗伯茨", + "variant": "refit", + "rarity": 4, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1062.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BD%97%E4%BC%AF%E8%8C%A8" + }, + { + "id": 1063, + "name": "阿贝克隆比·改", + "search_name": "阿贝克隆比", + "variant": "refit", + "rarity": 4, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1063.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%BF%E8%B4%9D%E5%85%8B%E9%9A%86%E6%AF%94" + }, + { + "id": 1064, + "name": "吹雪·改", + "search_name": "吹雪", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1064.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%90%B9%E9%9B%AA" + }, + { + "id": 1065, + "name": "白雪·改", + "search_name": "白雪", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1065.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%99%BD%E9%9B%AA" + }, + { + "id": 1066, + "name": "初雪·改", + "search_name": "初雪", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1066.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%9D%E9%9B%AA" + }, + { + "id": 1067, + "name": "深雪·改", + "search_name": "深雪", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1067.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B7%B1%E9%9B%AA" + }, + { + "id": 1068, + "name": "晓·改", + "search_name": "晓", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1068.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%99%93" + }, + { + "id": 1069, + "name": "信赖", + "search_name": "信赖", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1069.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%93%8D" + }, + { + "id": 1070, + "name": "雷·改", + "search_name": "雷", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1070.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9B%B7" + }, + { + "id": 1071, + "name": "电·改", + "search_name": "电", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1071.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%94%B5" + }, + { + "id": 1072, + "name": "绫波·改", + "search_name": "绫波", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1072.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BB%AB%E6%B3%A2" + }, + { + "id": 1073, + "name": "敷波·改", + "search_name": "敷波", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1073.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%95%B7%E6%B3%A2" + }, + { + "id": 1074, + "name": "Z1·改", + "search_name": "Z1", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1074.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z1" + }, + { + "id": 1075, + "name": "Z16·改", + "search_name": "Z16", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1075.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z16" + }, + { + "id": 1076, + "name": "Z21·改", + "search_name": "Z21", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1076.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z21" + }, + { + "id": 1077, + "name": "Z22·改", + "search_name": "Z22", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1077.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z22" + }, + { + "id": 1079, + "name": "Z28·改", + "search_name": "Z28", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1079.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z28" + }, + { + "id": 1080, + "name": "Z31·改", + "search_name": "Z31", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1080.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z31" + }, + { + "id": 1081, + "name": "紫石英·改", + "search_name": "紫石英", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1081.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%B4%AB%E7%9F%B3%E8%8B%B1" + }, + { + "id": 1082, + "name": "萤火虫·改", + "search_name": "萤火虫", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1082.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%90%A4%E7%81%AB%E8%99%AB" + }, + { + "id": 1083, + "name": "标枪·改", + "search_name": "标枪", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1083.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%A0%87%E6%9E%AA" + }, + { + "id": 1084, + "name": "天后·改", + "search_name": "天后", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1084.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A9%E5%90%8E" + }, + { + "id": 1085, + "name": "黑背豺·改", + "search_name": "黑背豺", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1085.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%91%E8%83%8C%E8%B1%BA" + }, + { + "id": 1086, + "name": "哥萨克人·改", + "search_name": "哥萨克人", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1086.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%93%A5%E8%90%A8%E5%85%8B%E4%BA%BA" + }, + { + "id": 1087, + "name": "爱斯基摩人·改", + "search_name": "爱斯基摩人", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1087.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%88%B1%E6%96%AF%E5%9F%BA%E6%91%A9%E4%BA%BA" + }, + { + "id": 1088, + "name": "旁遮普人·改", + "search_name": "旁遮普人", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1088.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%81%E9%81%AE%E6%99%AE%E4%BA%BA" + }, + { + "id": 1089, + "name": "弗莱彻·改", + "search_name": "弗莱彻", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1089.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BC%97%E8%8E%B1%E5%BD%BB" + }, + { + "id": 1092, + "name": "布雷恩·改", + "search_name": "布雷恩", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1092.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%83%E9%9B%B7%E6%81%A9" + }, + { + "id": 1093, + "name": "基林·改", + "search_name": "基林", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1093.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%BA%E6%9E%97" + }, + { + "id": 1094, + "name": "基阿特·改", + "search_name": "基阿特", + "variant": "refit", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1094.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%BA%E9%98%BF%E7%89%B9" + }, + { + "id": 1097, + "name": "长春", + "search_name": "长春", + "variant": "refit", + "rarity": 5, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "china", + "portrait": "assets/portraits/1097.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9E%9C%E6%95%A2" + }, + { + "id": 1098, + "name": "沃克兰·改", + "search_name": "沃克兰", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/1098.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B2%83%E5%85%8B%E5%85%B0" + }, + { + "id": 1099, + "name": "空想·改", + "search_name": "空想", + "variant": "refit", + "rarity": 6, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/1099.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A9%BA%E6%83%B3" + }, + { + "id": 1100, + "name": "狮(战列舰)·改", + "search_name": "狮(战列舰)", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1100.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%8B%AE(%E6%88%98%E5%88%97%E8%88%B0)" + }, + { + "id": 1101, + "name": "长门·改", + "search_name": "长门", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1101.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%95%BF%E9%97%A8" + }, + { + "id": 1102, + "name": "陆奥·改", + "search_name": "陆奥", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1102.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%99%86%E5%A5%A5" + }, + { + "id": 1105, + "name": "前卫·改", + "search_name": "前卫", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1105.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%89%8D%E5%8D%AB" + }, + { + "id": 1106, + "name": "田纳西·改", + "search_name": "田纳西", + "variant": "refit", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1106.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%94%B0%E7%BA%B3%E8%A5%BF" + }, + { + "id": 1107, + "name": "加利福尼亚·改", + "search_name": "加利福尼亚", + "variant": "refit", + "rarity": 4, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1107.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E5%88%A9%E7%A6%8F%E5%B0%BC%E4%BA%9A" + }, + { + "id": 1108, + "name": "科罗拉多·改", + "search_name": "科罗拉多", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1108.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A7%91%E7%BD%97%E6%8B%89%E5%A4%9A" + }, + { + "id": 1109, + "name": "马里兰·改", + "search_name": "马里兰", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1109.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E9%87%8C%E5%85%B0" + }, + { + "id": 1110, + "name": "西弗吉尼亚·改", + "search_name": "西弗吉尼亚", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1110.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%A5%BF%E5%BC%97%E5%90%89%E5%B0%BC%E4%BA%9A" + }, + { + "id": 1111, + "name": "华盛顿·改", + "search_name": "华盛顿", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1111.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%8E%E7%9B%9B%E9%A1%BF" + }, + { + "id": 1112, + "name": "维托里奥·维内托·改", + "search_name": "维托里奥·维内托", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/1112.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BB%B4%E6%89%98%E9%87%8C%E5%A5%A5%C2%B7%E7%BB%B4%E5%86%85%E6%89%98" + }, + { + "id": 1113, + "name": "黎塞留·改", + "search_name": "黎塞留", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/1113.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%8E%E5%A1%9E%E7%95%99" + }, + { + "id": 1117, + "name": "大凤·改", + "search_name": "大凤", + "variant": "refit", + "rarity": 6, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1117.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E5%87%A4" + }, + { + "id": 1118, + "name": "齐柏林伯爵·改", + "search_name": "齐柏林伯爵", + "variant": "refit", + "rarity": 5, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/1118.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BD%90%E6%9F%8F%E6%9E%97%E4%BC%AF%E7%88%B5" + }, + { + "id": 1120, + "name": "约克城·改", + "search_name": "约克城", + "variant": "refit", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1120.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%A6%E5%85%8B%E5%9F%8E" + }, + { + "id": 1121, + "name": "企业·改", + "search_name": "企业", + "variant": "refit", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1121.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%81%E4%B8%9A" + }, + { + "id": 1123, + "name": "博格·改", + "search_name": "博格", + "variant": "refit", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1123.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%9A%E6%A0%BC" + }, + { + "id": 1124, + "name": "追赶者·改", + "search_name": "追赶者", + "variant": "refit", + "rarity": 5, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1124.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%BF%BD%E8%B5%B6%E8%80%85" + }, + { + "id": 1125, + "name": "埃罗芒什", + "search_name": "埃罗芒什", + "variant": "refit", + "rarity": 5, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/1125.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B7%A8%E5%83%8F" + }, + { + "id": 1126, + "name": "普林斯顿·改", + "search_name": "普林斯顿", + "variant": "refit", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1126.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%99%AE%E6%9E%97%E6%96%AF%E9%A1%BF" + }, + { + "id": 1130, + "name": "斯佩伯爵海军上将·改", + "search_name": "斯佩伯爵海军上将", + "variant": "refit", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/1130.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%AF%E4%BD%A9%E4%BC%AF%E7%88%B5%E6%B5%B7%E5%86%9B%E4%B8%8A%E5%B0%86" + }, + { + "id": 1131, + "name": "古鹰·改", + "search_name": "古鹰", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1131.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%A4%E9%B9%B0" + }, + { + "id": 1132, + "name": "加古·改", + "search_name": "加古", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1132.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E5%8F%A4" + }, + { + "id": 1133, + "name": "青叶·改", + "search_name": "青叶", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1133.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9D%92%E5%8F%B6" + }, + { + "id": 1135, + "name": "伦敦·改", + "search_name": "伦敦", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1135.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%A6%E6%95%A6" + }, + { + "id": 1136, + "name": "肯特·改", + "search_name": "肯特", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1136.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%82%AF%E7%89%B9" + }, + { + "id": 1137, + "name": "波特兰·改", + "search_name": "波特兰", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1137.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%A2%E7%89%B9%E5%85%B0" + }, + { + "id": 1139, + "name": "彭萨科拉·改", + "search_name": "彭萨科拉", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1139.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BD%AD%E8%90%A8%E7%A7%91%E6%8B%89" + }, + { + "id": 1141, + "name": "北安普顿·改", + "search_name": "北安普顿", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1141.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8C%97%E5%AE%89%E6%99%AE%E9%A1%BF" + }, + { + "id": 1142, + "name": "休斯顿·改", + "search_name": "休斯顿", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1142.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%91%E6%96%AF%E9%A1%BF" + }, + { + "id": 1143, + "name": "新奥尔良·改", + "search_name": "新奥尔良", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1143.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%96%B0%E5%A5%A5%E5%B0%94%E8%89%AF" + }, + { + "id": 1145, + "name": "川内·改", + "search_name": "川内", + "variant": "refit", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1145.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B7%9D%E5%86%85" + }, + { + "id": 1149, + "name": "埃姆登·改", + "search_name": "埃姆登", + "variant": "refit", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1149.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%83%E5%A7%86%E7%99%BB" + }, + { + "id": 1150, + "name": "翡翠·改", + "search_name": "翡翠", + "variant": "refit", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1150.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BF%A1%E7%BF%A0" + }, + { + "id": 1151, + "name": "进取·改", + "search_name": "进取", + "variant": "refit", + "rarity": 3, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1151.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%BF%9B%E5%8F%96" + }, + { + "id": 1158, + "name": "圣胡安·改", + "search_name": "圣胡安", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1158.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%A3%E8%83%A1%E5%AE%89" + }, + { + "id": 1160, + "name": "摩尔曼斯克·改", + "search_name": "摩尔曼斯克", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1160.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%91%A9%E5%B0%94%E6%9B%BC%E6%96%AF%E5%85%8B" + }, + { + "id": 1162, + "name": "逸仙·改", + "search_name": "逸仙", + "variant": "refit", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/1162.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%80%B8%E4%BB%99" + }, + { + "id": 1164, + "name": "秋月·改", + "search_name": "秋月", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1164.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A7%8B%E6%9C%88" + }, + { + "id": 1165, + "name": "凉月·改", + "search_name": "凉月", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1165.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%87%89%E6%9C%88" + }, + { + "id": 1166, + "name": "阳炎·改", + "search_name": "阳炎", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1166.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%98%B3%E7%82%8E" + }, + { + "id": 1167, + "name": "不知火·改", + "search_name": "不知火", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1167.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%8D%E7%9F%A5%E7%81%AB" + }, + { + "id": 1168, + "name": "黑潮·改", + "search_name": "黑潮", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1168.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%91%E6%BD%AE" + }, + { + "id": 1169, + "name": "丹阳", + "search_name": "丹阳", + "variant": "refit", + "rarity": 6, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/1169.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9B%AA%E9%A3%8E" + }, + { + "id": 1171, + "name": "Z46·改", + "search_name": "Z46", + "variant": "refit", + "rarity": 6, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1171.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z46" + }, + { + "id": 1175, + "name": "维纳斯·改", + "search_name": "维纳斯", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1175.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BB%B4%E7%BA%B3%E6%96%AF" + }, + { + "id": 1178, + "name": "沙利文·改", + "search_name": "沙利文", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1178.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B2%99%E5%88%A9%E6%96%87" + }, + { + "id": 1181, + "name": "威廉·D·波特·改", + "search_name": "威廉·D·波特", + "variant": "refit", + "rarity": 6, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1181.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E5%BB%89%C2%B7D%C2%B7%E6%B3%A2%E7%89%B9" + }, + { + "id": 1182, + "name": "波特·改", + "search_name": "波特", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1182.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%A2%E7%89%B9" + }, + { + "id": 1183, + "name": "拉菲(DD-724)·改", + "search_name": "拉菲(DD-724)", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1183.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8B%89%E8%8F%B2(DD-724)" + }, + { + "id": 1185, + "name": "机灵", + "search_name": "机灵", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1185.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E7%B1%B3%E5%A5%91%E4%BA%9A%C2%B7%E5%86%85%E6%8B%89" + }, + { + "id": 1187, + "name": "安东尼奥·达诺利·改", + "search_name": "安东尼奥·达诺利", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/1187.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AE%89%E4%B8%9C%E5%B0%BC%E5%A5%A5%C2%B7%E8%BE%BE%E8%AF%BA%E5%88%A9" + }, + { + "id": 1188, + "name": "乌戈里尼·维瓦尔迪·改", + "search_name": "乌戈里尼·维瓦尔迪", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/1188.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B9%8C%E6%88%88%E9%87%8C%E5%B0%BC%C2%B7%E7%BB%B4%E7%93%A6%E5%B0%94%E8%BF%AA" + }, + { + "id": 1192, + "name": "塔什干·改", + "search_name": "塔什干", + "variant": "refit", + "rarity": 6, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1192.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%94%E4%BB%80%E5%B9%B2" + }, + { + "id": 1194, + "name": "大青花鱼·改", + "search_name": "大青花鱼", + "variant": "refit", + "rarity": 6, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1194.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E9%9D%92%E8%8A%B1%E9%B1%BC" + }, + { + "id": 1195, + "name": "射水鱼·改", + "search_name": "射水鱼", + "variant": "refit", + "rarity": 6, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1195.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B0%84%E6%B0%B4%E9%B1%BC" + }, + { + "id": 1197, + "name": "U-47·改", + "search_name": "U-47", + "variant": "refit", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1197.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-47" + }, + { + "id": 1198, + "name": "U-505·改", + "search_name": "U-505", + "variant": "refit", + "rarity": 6, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1198.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-505" + }, + { + "id": 1199, + "name": "絮库夫·改", + "search_name": "絮库夫", + "variant": "refit", + "rarity": 4, + "ship_type": "sc", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/1199.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/sc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%B5%AE%E5%BA%93%E5%A4%AB" + }, + { + "id": 1205, + "name": "约克公爵·改", + "search_name": "约克公爵", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1205.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%A6%E5%85%8B%E5%85%AC%E7%88%B5" + }, + { + "id": 1206, + "name": "北卡罗来纳·改", + "search_name": "北卡罗来纳", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1206.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8C%97%E5%8D%A1%E7%BD%97%E6%9D%A5%E7%BA%B3" + }, + { + "id": 1207, + "name": "南达科他(BB-57)·改", + "search_name": "南达科他(BB-57)", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1207.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%97%E8%BE%BE%E7%A7%91%E4%BB%96(BB-57)" + }, + { + "id": 1209, + "name": "密苏里·改", + "search_name": "密苏里", + "variant": "refit", + "rarity": 6, + "ship_type": "bbg", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1209.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bbg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%AF%86%E8%8B%8F%E9%87%8C" + }, + { + "id": 1211, + "name": "卡约·杜伊里奥·改", + "search_name": "卡约·杜伊里奥", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/1211.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E7%BA%A6%C2%B7%E6%9D%9C%E4%BC%8A%E9%87%8C%E5%A5%A5" + }, + { + "id": 1215, + "name": "玛丽亚皇后·改", + "search_name": "玛丽亚皇后", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/1215.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%8E%9B%E4%B8%BD%E4%BA%9A%E7%9A%87%E5%90%8E" + }, + { + "id": 1219, + "name": "瑞鹤·改", + "search_name": "瑞鹤", + "variant": "refit", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1219.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%91%9E%E9%B9%A4" + }, + { + "id": 1220, + "name": "翔鹤·改", + "search_name": "翔鹤", + "variant": "refit", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1220.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BF%94%E9%B9%A4" + }, + { + "id": 1221, + "name": "飞龙·改", + "search_name": "飞龙", + "variant": "refit", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1221.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A3%9E%E9%BE%99" + }, + { + "id": 1222, + "name": "苍龙·改", + "search_name": "苍龙", + "variant": "refit", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1222.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8B%8D%E9%BE%99" + }, + { + "id": 1223, + "name": "信浓·改", + "search_name": "信浓", + "variant": "refit", + "rarity": 6, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "japan", + "portrait": "assets/portraits/1223.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BF%A1%E6%B5%93" + }, + { + "id": 1224, + "name": "可畏·改", + "search_name": "可畏", + "variant": "refit", + "rarity": 6, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1224.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%AF%E7%95%8F" + }, + { + "id": 1225, + "name": "黄蜂(CV-7)·改", + "search_name": "黄蜂(CV-7)", + "variant": "refit", + "rarity": 5, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1225.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%BB%84%E8%9C%82(CV-7)" + }, + { + "id": 1227, + "name": "飞鹰·改", + "search_name": "飞鹰", + "variant": "refit", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1227.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A3%9E%E9%B9%B0" + }, + { + "id": 1228, + "name": "隼鹰·改", + "search_name": "隼鹰", + "variant": "refit", + "rarity": 4, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1228.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9A%BC%E9%B9%B0" + }, + { + "id": 1232, + "name": "贝亚恩·改", + "search_name": "贝亚恩", + "variant": "refit", + "rarity": 4, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/1232.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B4%9D%E4%BA%9A%E6%81%A9" + }, + { + "id": 1233, + "name": "最上·改", + "search_name": "最上", + "variant": "refit", + "rarity": 5, + "ship_type": "cav", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1233.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cav.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%9C%80%E4%B8%8A" + }, + { + "id": 1238, + "name": "约克·改", + "search_name": "约克", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1238.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%A6%E5%85%8B" + }, + { + "id": 1239, + "name": "埃克赛特·改", + "search_name": "埃克赛特", + "variant": "refit", + "rarity": 4, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1239.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%83%E5%85%8B%E8%B5%9B%E7%89%B9" + }, + { + "id": 1240, + "name": "旧金山·改", + "search_name": "旧金山", + "variant": "refit", + "rarity": 5, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1240.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A7%E9%87%91%E5%B1%B1" + }, + { + "id": 1241, + "name": "巴尔的摩·改", + "search_name": "巴尔的摩", + "variant": "refit", + "rarity": 6, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1241.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B7%B4%E5%B0%94%E7%9A%84%E6%91%A9" + }, + { + "id": 1244, + "name": "灵敏·改", + "search_name": "灵敏", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1244.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%81%B5%E6%95%8F" + }, + { + "id": 1247, + "name": "香取·改", + "search_name": "香取", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1247.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A6%99%E5%8F%96" + }, + { + "id": 1248, + "name": "大淀·改", + "search_name": "大淀", + "variant": "refit", + "rarity": 6, + "ship_type": "cf", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1248.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cf.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A4%A7%E6%B7%80" + }, + { + "id": 1249, + "name": "莱比锡·改", + "search_name": "莱比锡", + "variant": "refit", + "rarity": 4, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1249.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8E%B1%E6%AF%94%E9%94%A1" + }, + { + "id": 1258, + "name": "高波·改", + "search_name": "高波", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1258.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%AB%98%E6%B3%A2" + }, + { + "id": 1265, + "name": "岚·改", + "search_name": "岚", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1265.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B2%9A" + }, + { + "id": 1266, + "name": "初夏·改", + "search_name": "初夏", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1266.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%9D%E5%A4%8F" + }, + { + "id": 1267, + "name": "岛风(岛风型驱逐舰)·改", + "search_name": "岛风(岛风型驱逐舰)", + "variant": "refit", + "rarity": 6, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1267.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B2%9B%E9%A3%8E(%E5%B2%9B%E9%A3%8E%E5%9E%8B%E9%A9%B1%E9%80%90%E8%88%B0)" + }, + { + "id": 1269, + "name": "Z17·改", + "search_name": "Z17", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1269.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z17" + }, + { + "id": 1270, + "name": "Z18·改", + "search_name": "Z18", + "variant": "refit", + "rarity": 3, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1270.webp", + "background": "assets/backgrounds/rarity-3.webp", + "frame": "assets/frames/rarity-3.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/Z18" + }, + { + "id": 1273, + "name": "塞尔弗里奇·改", + "search_name": "塞尔弗里奇", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1273.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%9E%E5%B0%94%E5%BC%97%E9%87%8C%E5%A5%87" + }, + { + "id": 1275, + "name": "康弗斯·改", + "search_name": "康弗斯", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1275.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BA%B7%E5%BC%97%E6%96%AF" + }, + { + "id": 1277, + "name": "克拉克斯顿·改", + "search_name": "克拉克斯顿", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1277.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%8B%E6%8B%89%E5%85%8B%E6%96%AF%E9%A1%BF" + }, + { + "id": 1278, + "name": "霍埃尔·改", + "search_name": "霍埃尔", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1278.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9C%8D%E5%9F%83%E5%B0%94" + }, + { + "id": 1279, + "name": "塞缪尔·B·罗伯茨·改", + "search_name": "塞缪尔·B·罗伯茨", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1279.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A1%9E%E7%BC%AA%E5%B0%94%C2%B7B%C2%B7%E7%BD%97%E4%BC%AF%E8%8C%A8" + }, + { + "id": 1280, + "name": "约翰斯顿·改", + "search_name": "约翰斯顿", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1280.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%BA%A6%E7%BF%B0%E6%96%AF%E9%A1%BF" + }, + { + "id": 1289, + "name": "U-81·改", + "search_name": "U-81", + "variant": "refit", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1289.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-81" + }, + { + "id": 1290, + "name": "U-96·改", + "search_name": "U-96", + "variant": "refit", + "rarity": 6, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1290.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-96" + }, + { + "id": 1291, + "name": "U-2540·改", + "search_name": "U-2540", + "variant": "refit", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1291.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-2540" + }, + { + "id": 1293, + "name": "U-1206·改", + "search_name": "U-1206", + "variant": "refit", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1293.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-1206" + }, + { + "id": 1299, + "name": "让巴尔·改", + "search_name": "让巴尔", + "variant": "refit", + "rarity": 6, + "ship_type": "bbg", + "size_class": "large", + "role_class": "main_force", + "country": "france", + "portrait": "assets/portraits/1299.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bbg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%AE%A9%E5%B7%B4%E5%B0%94" + }, + { + "id": 1301, + "name": "马汉·改", + "search_name": "马汉", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1301.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E6%B1%89" + }, + { + "id": 1306, + "name": "巴夫勒尔·改", + "search_name": "巴夫勒尔", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1306.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B7%B4%E5%A4%AB%E5%8B%92%E5%B0%94" + }, + { + "id": 1311, + "name": "瓜达卡纳尔·改", + "search_name": "瓜达卡纳尔", + "variant": "refit", + "rarity": 5, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1311.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%93%9C%E8%BE%BE%E5%8D%A1%E7%BA%B3%E5%B0%94" + }, + { + "id": 1316, + "name": "明斯克·改", + "search_name": "明斯克", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1316.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%98%8E%E6%96%AF%E5%85%8B" + }, + { + "id": 1323, + "name": "基辅·改", + "search_name": "基辅", + "variant": "refit", + "rarity": 6, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1323.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9F%BA%E8%BE%85" + }, + { + "id": 1325, + "name": "列克星敦(CV-16)·改", + "search_name": "列克星敦(CV-16)", + "variant": "refit", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1325.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%88%97%E5%85%8B%E6%98%9F%E6%95%A6(CV-16)" + }, + { + "id": 1332, + "name": "神鹰·改", + "search_name": "神鹰", + "variant": "refit", + "rarity": 5, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1332.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%A5%9E%E9%B9%B0" + }, + { + "id": 1335, + "name": "伏尔塔·改", + "search_name": "伏尔塔", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/1335.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8F%E5%B0%94%E5%A1%94" + }, + { + "id": 1339, + "name": "帝国·改", + "search_name": "帝国", + "variant": "refit", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/1339.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%B8%9D%E5%9B%BD" + }, + { + "id": 1340, + "name": "波尔扎诺·改", + "search_name": "波尔扎诺", + "variant": "refit", + "rarity": 5, + "ship_type": "cav", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/1340.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cav.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B3%A2%E5%B0%94%E6%89%8E%E8%AF%BA" + }, + { + "id": 1342, + "name": "江原·改", + "search_name": "江原", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/1342.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B1%9F%E5%8E%9F" + }, + { + "id": 1343, + "name": "蔚山·改", + "search_name": "蔚山", + "variant": "refit", + "rarity": 6, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "other", + "portrait": "assets/portraits/1343.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%94%9A%E5%B1%B1" + }, + { + "id": 1344, + "name": "忠武·改", + "search_name": "忠武", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/1344.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BF%A0%E6%AD%A6" + }, + { + "id": 1351, + "name": "U-1405·改", + "search_name": "U-1405", + "variant": "refit", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1351.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/U-1405" + }, + { + "id": 1362, + "name": "星座·改", + "search_name": "星座", + "variant": "refit", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/1362.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%98%9F%E5%BA%A7" + }, + { + "id": 1363, + "name": "炽热·改", + "search_name": "炽热", + "variant": "refit", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1363.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%82%BD%E7%83%AD" + }, + { + "id": 1366, + "name": "鹦鹉螺·改", + "search_name": "鹦鹉螺", + "variant": "refit", + "rarity": 6, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1366.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B9%A6%E9%B9%89%E8%9E%BA" + }, + { + "id": 1372, + "name": "早春·改", + "search_name": "早春", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1372.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A9%E6%98%A5" + }, + { + "id": 1380, + "name": "圣乔治·改", + "search_name": "圣乔治", + "variant": "refit", + "rarity": 6, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1380.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%9C%A3%E4%B9%94%E6%B2%BB" + }, + { + "id": 1400, + "name": "七省联盟·改", + "search_name": "七省联盟", + "variant": "refit", + "rarity": 5, + "ship_type": "cgaa", + "size_class": "medium", + "role_class": "escort", + "country": "other", + "portrait": "assets/portraits/1400.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%B8%83%E7%9C%81%E8%81%94%E7%9B%9F" + }, + { + "id": 1408, + "name": "鲃鱼·改", + "search_name": "鲃鱼", + "variant": "refit", + "rarity": 6, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1408.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%B2%83%E9%B1%BC" + }, + { + "id": 1413, + "name": "加里波第·改", + "search_name": "加里波第", + "variant": "refit", + "rarity": 5, + "ship_type": "cgaa", + "size_class": "medium", + "role_class": "escort", + "country": "italy", + "portrait": "assets/portraits/1413.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8A%A0%E9%87%8C%E6%B3%A2%E7%AC%AC" + }, + { + "id": 1414, + "name": "凯利·改", + "search_name": "凯利", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1414.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%87%AF%E5%88%A9" + }, + { + "id": 1416, + "name": "47工程·改", + "search_name": "47工程", + "variant": "refit", + "rarity": 6, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1416.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/47%E5%B7%A5%E7%A8%8B" + }, + { + "id": 1425, + "name": "史密斯·改", + "search_name": "史密斯", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1425.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8F%B2%E5%AF%86%E6%96%AF" + }, + { + "id": 1426, + "name": "彼得·施特拉塞尔·改", + "search_name": "彼得·施特拉塞尔", + "variant": "refit", + "rarity": 6, + "ship_type": "cv", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/1426.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/cv.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BD%BC%E5%BE%97%C2%B7%E6%96%BD%E7%89%B9%E6%8B%89%E5%A1%9E%E5%B0%94" + }, + { + "id": 1429, + "name": "马伊·布雷泽·改", + "search_name": "马伊·布雷泽", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "france", + "portrait": "assets/portraits/1429.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%A9%AC%E4%BC%8A%C2%B7%E5%B8%83%E9%9B%B7%E6%B3%BD" + }, + { + "id": 1430, + "name": "捷尔任斯基·改", + "search_name": "捷尔任斯基", + "variant": "refit", + "rarity": 5, + "ship_type": "cgaa", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1430.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8D%B7%E5%B0%94%E4%BB%BB%E6%96%AF%E5%9F%BA" + }, + { + "id": 1431, + "name": "什罗普郡·改", + "search_name": "什罗普郡", + "variant": "refit", + "rarity": 5, + "ship_type": "ca", + "size_class": "medium", + "role_class": "escort", + "country": "united_kingdom", + "portrait": "assets/portraits/1431.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ca.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BB%80%E7%BD%97%E6%99%AE%E9%83%A1" + }, + { + "id": 1456, + "name": "塔林", + "search_name": "塔林", + "variant": "refit", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1456.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%BD%BC%E5%BE%97%E7%BD%97%E5%B7%B4%E7%94%AB%E6%B4%9B%E5%A4%AB%E6%96%AF%E5%85%8B" + }, + { + "id": 1467, + "name": "鞍山·改", + "search_name": "鞍山", + "variant": "refit", + "rarity": 5, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "china", + "portrait": "assets/portraits/1467.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%9E%8D%E5%B1%B1" + }, + { + "id": 1483, + "name": "胜利·改", + "search_name": "胜利", + "variant": "refit", + "rarity": 6, + "ship_type": "av", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/1483.webp", + "background": "assets/backgrounds/rarity-6.webp", + "frame": "assets/frames/rarity-6.webp", + "type_icon": "assets/type-icons/av.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%83%9C%E5%88%A9" + }, + { + "id": 1490, + "name": "克劳塞维茨·改", + "search_name": "克劳塞维茨", + "variant": "refit", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/1490.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%85%8B%E5%8A%B3%E5%A1%9E%E7%BB%B4%E8%8C%A8" + }, + { + "id": 1496, + "name": "诺福克(DL-1)·改", + "search_name": "诺福克(DL-1)", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1496.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%AF%BA%E7%A6%8F%E5%85%8B(DL-1)" + }, + { + "id": 1503, + "name": "T-23·改", + "search_name": "T-23", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1503.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/T-23" + }, + { + "id": 1509, + "name": "谦逊·改", + "search_name": "谦逊", + "variant": "refit", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1509.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%B0%A6%E9%80%8A" + }, + { + "id": 1516, + "name": "日丹诺夫·改", + "search_name": "日丹诺夫", + "variant": "refit", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1516.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%97%A5%E4%B8%B9%E8%AF%BA%E5%A4%AB" + }, + { + "id": 1517, + "name": "吕贝克·改", + "search_name": "吕贝克", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1517.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%90%95%E8%B4%9D%E5%85%8B" + }, + { + "id": 1519, + "name": "T.995·改", + "search_name": "T.995", + "variant": "refit", + "rarity": 4, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/1519.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/T.995" + }, + { + "id": 1527, + "name": "CNT巡洋舰·改", + "search_name": "CNT巡洋舰", + "variant": "refit", + "rarity": 5, + "ship_type": "cl", + "size_class": "medium", + "role_class": "escort", + "country": "china", + "portrait": "assets/portraits/1527.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/CNT%E5%B7%A1%E6%B4%8B%E8%88%B0" + }, + { + "id": 1528, + "name": "芝加哥(CA-136)·改", + "search_name": "芝加哥(CA-136)", + "variant": "refit", + "rarity": 5, + "ship_type": "cgaa", + "size_class": "medium", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1528.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%8A%9D%E5%8A%A0%E5%93%A5(CA-136)" + }, + { + "id": 1530, + "name": "M-296·改", + "search_name": "M-296", + "variant": "refit", + "rarity": 5, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1530.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/M-296" + }, + { + "id": 1532, + "name": "但丁·改", + "search_name": "但丁", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/1532.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BD%86%E4%B8%81" + }, + { + "id": 1538, + "name": "伊-25·改", + "search_name": "伊-25", + "variant": "refit", + "rarity": 4, + "ship_type": "ss", + "size_class": "small", + "role_class": "escort", + "country": "japan", + "portrait": "assets/portraits/1538.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/ss.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%8A-25" + }, + { + "id": 1545, + "name": "威悉河·改", + "search_name": "威悉河", + "variant": "refit", + "rarity": 5, + "ship_type": "cvl", + "size_class": "medium", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1545.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/cvl.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E6%82%89%E6%B2%B3" + }, + { + "id": 1560, + "name": "石勒苏益格-荷尔施泰因·改", + "search_name": "石勒苏益格-荷尔施泰因", + "variant": "refit", + "rarity": 4, + "ship_type": "bm", + "size_class": "small", + "role_class": "escort", + "country": "germany", + "portrait": "assets/portraits/1560.webp", + "background": "assets/backgrounds/rarity-4.webp", + "frame": "assets/frames/rarity-4.webp", + "type_icon": "assets/type-icons/bm.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%9F%B3%E5%8B%92%E8%8B%8F%E7%9B%8A%E6%A0%BC-%E8%8D%B7%E5%B0%94%E6%96%BD%E6%B3%B0%E5%9B%A0" + }, + { + "id": 1575, + "name": "威武·改", + "search_name": "威武", + "variant": "refit", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "soviet_union", + "portrait": "assets/portraits/1575.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%A8%81%E6%AD%A6" + }, + { + "id": 1583, + "name": "卡拉乔洛·改", + "search_name": "卡拉乔洛", + "variant": "refit", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "italy", + "portrait": "assets/portraits/1583.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%A1%E6%8B%89%E4%B9%94%E6%B4%9B" + }, + { + "id": 1589, + "name": "休·W·哈德利·改", + "search_name": "休·W·哈德利", + "variant": "refit", + "rarity": 5, + "ship_type": "dd", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1589.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/dd.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E4%BC%91%C2%B7W%C2%B7%E5%93%88%E5%BE%B7%E5%88%A9" + }, + { + "id": 1590, + "name": "金伯恩·改", + "search_name": "金伯恩", + "variant": "refit", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "soviet_union", + "portrait": "assets/portraits/1590.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E9%87%91%E4%BC%AF%E6%81%A9" + }, + { + "id": 1606, + "name": "汉堡·改", + "search_name": "汉堡", + "variant": "refit", + "rarity": 5, + "ship_type": "ddg", + "size_class": "small", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/1606.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddg.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%B1%89%E5%A0%A1" + }, + { + "id": 1618, + "name": "米切尔·改", + "search_name": "米切尔", + "variant": "refit", + "rarity": 5, + "ship_type": "ddgaa", + "size_class": "small", + "role_class": "escort", + "country": "united_states", + "portrait": "assets/portraits/1618.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/ddgaa.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E7%B1%B3%E5%88%87%E5%B0%94" + }, + { + "id": 8007, + "name": "提尔比茨(儿童节)", + "search_name": "提尔比茨(儿童节)", + "variant": "special", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "germany", + "portrait": "assets/portraits/8007.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%8F%90%E5%B0%94%E6%AF%94%E8%8C%A8" + }, + { + "id": 8009, + "name": "萝德尼", + "search_name": "萝德尼", + "variant": "special", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_kingdom", + "portrait": "assets/portraits/8009.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E8%90%9D%E5%BE%B7%E5%B0%BC" + }, + { + "id": 8111, + "name": "华盛顿(儿童节)", + "search_name": "华盛顿(儿童节)", + "variant": "special", + "rarity": 5, + "ship_type": "bb", + "size_class": "large", + "role_class": "main_force", + "country": "united_states", + "portrait": "assets/portraits/8111.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bb.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E5%8D%8E%E7%9B%9B%E9%A1%BF" + }, + { + "id": 8116, + "name": "戈本", + "search_name": "戈本", + "variant": "special", + "rarity": 5, + "ship_type": "bc", + "size_class": "large", + "role_class": "main_force", + "country": "other", + "portrait": "assets/portraits/8116.webp", + "background": "assets/backgrounds/rarity-5.webp", + "frame": "assets/frames/rarity-5.webp", + "type_icon": "assets/type-icons/bc.webp", + "wiki_url": "https://www.zjsnrwiki.com/wiki/%E6%88%88%E6%9C%AC" + } + ] +} diff --git a/resource/user_team_plans/.gitkeep b/resource/user_team_plans/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/resource/user_team_plans/.gitkeep @@ -0,0 +1 @@ + diff --git a/src/controller/app/AppController.ts b/src/controller/app/AppController.ts index 0a10a1e..91ce4fb 100644 --- a/src/controller/app/AppController.ts +++ b/src/controller/app/AppController.ts @@ -4,6 +4,7 @@ */ import { MainView } from '../../view/main/MainView'; import { PlanPreviewView } from '../../view/plan/PlanPreviewView'; +import { FleetPlannerView } from '../../view/plan/FleetPlannerView'; import { ConfigView } from '../../view/config/ConfigView'; import { TaskGroupView } from '../../view/taskGroup/TaskGroupView'; import { SetupWizardView } from '../../view/setup/SetupWizardView'; @@ -30,6 +31,7 @@ import { PRIORITY_LABELS, STATUS_TEXT } from './constants'; export class AppController { private mainView: MainView; private planView: PlanPreviewView; + private fleetPlannerView: FleetPlannerView; private configView: ConfigView; private taskGroupView: TaskGroupView; private setupView: SetupWizardView; @@ -48,6 +50,7 @@ export class AppController { private plansDir = ''; private configDir = ''; private heartbeatTimer: ReturnType | null = null; + private shipLibraryUpdating = false; private templateCtrl!: TemplateController; private taskGroupCtrl!: TaskGroupController; @@ -60,6 +63,7 @@ export class AppController { constructor() { this.mainView = new MainView(); this.planView = new PlanPreviewView(); + this.fleetPlannerView = new FleetPlannerView(); this.configView = new ConfigView(); this.taskGroupView = new TaskGroupView(); this.setupView = new SetupWizardView(); @@ -280,7 +284,13 @@ export class AppController { document.querySelector(`.nav-tab[data-page="${pageId}"]`)?.classList.add('active'); document.querySelectorAll('.page').forEach((p) => p.classList.remove('active')); document.getElementById(`page-${pageId}`)?.classList.add('active'); - if (pageId === 'config') this.refreshAdbStatus(); + if (pageId === 'fleet') { + void this.fleetPlannerView.load(); + } + if (pageId === 'config') { + this.refreshAdbStatus(); + void this.refreshShipLibraryStatus(); + } } // ════════════════════════════════════════ @@ -288,6 +298,12 @@ export class AppController { // ════════════════════════════════════════ private bindActions(): void { + window.electronBridge?.onShipLibraryUpdateProgress?.((progress) => { + if (this.shipLibraryUpdating) { + this.configView.setShipLibraryStatus(progress.message, 'unknown'); + } + }); + document.getElementById('btn-save-config')?.addEventListener('click', () => this.configCtrl.saveConfig()); document.getElementById('btn-open-plans-dir')?.addEventListener('click', () => this.openFolder(this.plansDir)); document.getElementById('btn-open-config-dir')?.addEventListener('click', () => this.openFolder(this.configDir)); @@ -359,6 +375,10 @@ export class AppController { await this.checkUpdatesManually(); }); + document.getElementById('btn-update-ship-library')?.addEventListener('click', async () => { + await this.updateShipLibrary(); + }); + document.getElementById('btn-check-adb')?.addEventListener('click', async () => { const bridge = window.electronBridge; if (!bridge?.checkAdbDevices) return; @@ -488,6 +508,69 @@ export class AppController { } } + private async refreshShipLibraryStatus(): Promise { + if (this.shipLibraryUpdating) return; + const bridge = window.electronBridge; + if (!bridge?.getShipLibraryStatus) return; + try { + const status = await bridge.getShipLibraryStatus(); + if (status.error) { + this.configView.setShipLibraryStatus(status.error, 'error'); + } else if (!status.exists) { + this.configView.setShipLibraryStatus('尚未建立本地资料库', 'unknown'); + } else if (status.missingAssets > 0) { + this.configView.setShipLibraryStatus( + `已收录 ${status.shipCount} 艘,缺少 ${status.missingAssets} 个资源`, + 'error', + ); + } else { + const updatedAt = status.generatedAt + ? new Date(status.generatedAt).toLocaleString('zh-CN', { hour12: false }) + : '时间未知'; + this.configView.setShipLibraryStatus( + `已收录 ${status.shipCount} 艘 · ${updatedAt}`, + 'ok', + ); + } + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + this.configView.setShipLibraryStatus(`状态读取失败: ${message}`, 'error'); + } + } + + private async updateShipLibrary(): Promise { + const bridge = window.electronBridge; + if (!bridge?.updateShipLibrary || this.shipLibraryUpdating) return; + this.shipLibraryUpdating = true; + this.configView.setShipLibraryUpdateLoading(true); + this.configView.setShipLibraryStatus('正在准备更新…', 'unknown'); + try { + const result = await bridge.updateShipLibrary(); + if (!result.success) { + const message = result.error || result.failures?.[0] || '未知错误'; + this.configView.setShipLibraryStatus(`更新失败: ${message}`, 'error'); + Logger.error(`舰船资料库更新失败: ${message}`); + return; + } + const summary = [ + `${result.ship_count ?? 0} 艘`, + `新增 ${result.added ?? 0}`, + `变化 ${result.updated ?? 0}`, + `下载 ${result.downloaded ?? 0}`, + ].join(','); + this.configView.setShipLibraryStatus(`更新完成:${summary}`, 'ok'); + Logger.info(`舰船资料库更新完成:${summary}`); + await this.fleetPlannerView.load(true); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + this.configView.setShipLibraryStatus(`更新失败: ${message}`, 'error'); + Logger.error(`舰船资料库更新异常: ${message}`); + } finally { + this.shipLibraryUpdating = false; + this.configView.setShipLibraryUpdateLoading(false); + } + } + private async checkUpdatesManually(): Promise { const bridge = window.electronBridge; if (!bridge) return; diff --git a/src/types/electronBridge.ts b/src/types/electronBridge.ts index 2c751aa..5c8963b 100644 --- a/src/types/electronBridge.ts +++ b/src/types/electronBridge.ts @@ -1,4 +1,103 @@ /** 通过 preload 注入的 IPC 桥 */ +export interface ShipLibraryStatus { + exists: boolean; + path: string; + generatedAt?: string; + shipCount: number; + assetCount: number; + missingAssets: number; + error?: string; +} + +export interface ShipLibraryUpdateResult { + success: boolean; + output?: string; + generated_at?: string; + ship_count?: number; + asset_count?: number; + added?: number; + updated?: number; + removed?: number; + downloaded?: number; + failed?: number; + failures?: string[]; + error?: string; +} + +export interface ShipLibraryLabels { + locale?: string; + ship_types: Record; + size_classes: Record; + role_classes: Record; + countries: Record; + variants: Record; +} + +export interface ShipLibraryShip { + id: number; + name: string; + search_name: string; + variant: 'normal' | 'refit' | 'special'; + rarity: number; + ship_type: string; + size_class: string; + role_class: string; + country: string; + portraitUrl: string; + backgroundUrl: string; + frameUrl: string; + typeIconUrl: string; + wiki_url?: string; +} + +export interface ShipLibraryManifest { + schemaVersion: number; + generatedAt: string; + labels: ShipLibraryLabels; + typeGroups: { + size_classes: Record; + role_classes: Record; + }; + ships: ShipLibraryShip[]; +} + +export interface UserTeamShipRule { + name: string; + search_name?: string; + ship_type?: string[]; + min_level?: number; + max_level?: number; +} + +export interface UserTeamPlanSlot { + name?: string; + search_name?: string; + ship_type?: string[]; + min_level?: number; + max_level?: number; + candidates?: UserTeamShipRule[]; +} + +export interface UserTeamPlan { + file?: string; + name: string; + ships: UserTeamPlanSlot[]; +} + +export interface UserTeamPlanResult { + success: boolean; + canceled?: boolean; + exists?: boolean; + file?: string; + plan?: UserTeamPlan; + error?: string; +} + +export interface UserTeamPlanListResult { + plans: UserTeamPlan[]; + errors: string[]; +} + export interface ElectronBridge { openDirectoryDialog: (title?: string) => Promise; openFileDialog: (filters: { name: string; extensions: string[] }[], defaultDir?: string) => Promise<{ path: string; content: string } | null>; @@ -60,6 +159,18 @@ export interface ElectronBridge { setSaveBackendScreenshots: (enabled: boolean) => Promise; getUpdateMode: () => 'auto' | 'manual'; setUpdateMode: (mode: 'auto' | 'manual') => Promise; + getShipLibraryStatus: () => Promise; + getShipLibraryManifest: () => Promise; + updateShipLibrary: () => Promise; + onShipLibraryUpdateProgress: ( + callback: (progress: { message: string }) => void, + ) => void; + saveUserTeamPlan: ( + plan: UserTeamPlan, + overwrite?: boolean, + ) => Promise; + pickUserTeamPlan: () => Promise; + listUserTeamPlans: () => Promise; getPythonPath: () => string | null; setPythonPath: (pythonPath: string | null) => Promise; validatePython: (pythonPath: string) => Promise<{ valid: boolean; version: string | null; error?: string }>; diff --git a/src/view/config/ConfigView.ts b/src/view/config/ConfigView.ts index de2d2c1..4e5ed52 100644 --- a/src/view/config/ConfigView.ts +++ b/src/view/config/ConfigView.ts @@ -47,6 +47,8 @@ export class ConfigView { private pythonStatus: HTMLElement | null; private adbStatus: HTMLElement | null; private validatePythonBtn: HTMLButtonElement | null; + private shipLibraryStatus: HTMLElement | null; + private updateShipLibraryBtn: HTMLButtonElement | null; constructor() { this.emuType = document.getElementById('cfg-emu-type') as HTMLSelectElement; @@ -91,6 +93,10 @@ export class ConfigView { this.pythonStatus = document.getElementById('cfg-python-status'); this.adbStatus = document.getElementById('cfg-adb-status'); this.validatePythonBtn = document.getElementById('btn-validate-python') as HTMLButtonElement | null; + this.shipLibraryStatus = document.getElementById('ship-library-status'); + this.updateShipLibraryBtn = document.getElementById( + 'btn-update-ship-library', + ) as HTMLButtonElement | null; // 调色盘实时预览 this.accentColor.addEventListener('input', () => { @@ -277,6 +283,23 @@ export class ConfigView { this.validatePythonBtn.textContent = loading ? '检测中…' : '检测'; } + setShipLibraryStatus(text: string, status: 'ok' | 'error' | 'unknown'): void { + if (!this.shipLibraryStatus) return; + this.shipLibraryStatus.textContent = text; + const cls = status === 'ok' + ? 'adb-status-online' + : status === 'error' + ? 'adb-status-offline' + : 'adb-status-unknown'; + this.shipLibraryStatus.className = `adb-status ${cls}`; + } + + setShipLibraryUpdateLoading(loading: boolean): void { + if (!this.updateShipLibraryBtn) return; + this.updateShipLibraryBtn.disabled = loading; + this.updateShipLibraryBtn.textContent = loading ? '正在更新…' : '更新舰船数据库'; + } + setEmulatorSerial(serial: string): void { this.emuSerial.value = serial; } diff --git a/src/view/index.html b/src/view/index.html index 95abc69..dcdeb3e 100644 --- a/src/view/index.html +++ b/src/view/index.html @@ -12,6 +12,7 @@ @@ -129,6 +130,159 @@

日志

+ +
+
+
+
+
+

舰队编队

+ +
+ + + +
+
+ + +
+
+
+
+
+
+ +
+
+

【位置1】的备选列表

+
+ + + + +
+
+
+
+
+
+
+ +
+
+
+

舰娘图鉴

+ 正在读取资料库… +
+
+ +
+ + +
+
+ +
+ +
+
+
+
@@ -724,6 +878,17 @@

更新与界面

+
+ +
+ 尚未检查 + +
+
+
diff --git a/src/view/plan/FleetPlannerView.ts b/src/view/plan/FleetPlannerView.ts new file mode 100644 index 0000000..40dd200 --- /dev/null +++ b/src/view/plan/FleetPlannerView.ts @@ -0,0 +1,1964 @@ +/** + * FleetPlannerView —— 本地舰队规划页面。 + * 读取 Electron 提供的舰船清单,负责筛选、排序、图鉴卡片和单支舰队草稿。 + * 国籍、大小和主力/护卫仅用于界面筛选,不会写入后端任务字段。 + */ +import type { + ShipLibraryLabels, + ShipLibraryManifest, + ShipLibraryShip, + UserTeamPlan, + UserTeamPlanSlot, + UserTeamShipRule, +} from '../../types/electronBridge'; +import { + showAlert, + showConfirm, +} from '../../controller/shared/DialogHelper'; + +type SortField = 'type' | 'name' | 'id'; +type FilterKind = 'group' | 'type' | 'country'; +type SlotGroup = 'formation' | 'backup'; + +interface FleetDragData { + source?: 'gallery' | SlotGroup; + shipId?: number; + position?: number; + candidateIndex?: number; +} + +const DEFAULT_BACKUP_SLOT_COUNT = 6; +const MIN_GALLERY_BATCH_SIZE = 12; +const GALLERY_CARD_WIDTH = 128; +const GALLERY_CARD_HEIGHT = 200; +const GALLERY_GAP = 6; +const FLEET_SLOT_COUNT = 6; +const FLEET_DRAG_MIME = 'application/x-autowsgr-fleet'; +const REFIT_FILTER_STORAGE_KEY = 'fleetPlannerRefitFilter'; +const EMPTY_LABELS: ShipLibraryLabels = { + ship_types: {}, + size_classes: {}, + role_classes: {}, + countries: {}, + variants: {}, +}; + +const SHIP_TYPE_SHORT_NAMES: Record = { + ap: '补给', + av: '装母', + bb: '战列', + bbg: '导战', + bbv: '航战', + bc: '战巡', + bm: '重炮', + ca: '重巡', + cav: '航巡', + cbg: '大巡', + cf: '旗舰', + cg: '导巡', + cgaa: '防巡', + cl: '轻巡', + clt: '雷巡', + cv: '航母', + cvl: '轻母', + dd: '驱逐', + ddg: '导驱', + ddgaa: '防驱', + sc: '炮潜', + ss: '潜艇', + ssg: '导潜', +}; + +const SHIP_TYPE_FILTER_ORDER = [ + 'ap', + 'av', + 'cv', + 'bb', + 'bbg', + 'bbv', + 'bc', + 'bm', + 'ca', + 'cav', + 'cl', + 'clt', + 'cvl', + 'dd', + 'ddg', + 'cg', + 'ssg', + 'sc', + 'ss', + 'ddgaa', + 'cgaa', + 'cbg', +]; + +const ALLOWED_FLEET_SHIP_TYPES = new Set([ + 'dd', + 'cl', + 'ca', + 'cav', + 'clt', + 'bb', + 'bc', + 'bbv', + 'cv', + 'cvl', + 'av', + 'ss', + 'ssg', + 'cg', + 'cgaa', + 'ddg', + 'ddgaa', + 'bm', + 'cbg', + 'cf', + 'ss_or_ssg', +]); + +interface FleetRuleDraft { + shipTypes: string[]; + levelEnabled: boolean; + minLevel: number | null; + maxLevel: number | null; +} + +interface FleetCandidateDraft extends FleetRuleDraft { + ship: ShipLibraryShip | null; +} + +interface FleetSlotDraft extends FleetRuleDraft { + primary: ShipLibraryShip | null; + candidates: FleetCandidateDraft[]; +} + +interface FleetDraft { + name: string; + file: string | null; + slots: FleetSlotDraft[]; +} + +function createFleetRuleDraft(): FleetRuleDraft { + return { + shipTypes: [], + levelEnabled: false, + minLevel: null, + maxLevel: null, + }; +} + +function createFleetCandidateDraft( + ship: ShipLibraryShip | null = null, +): FleetCandidateDraft { + return { + ship, + ...createFleetRuleDraft(), + }; +} + +function createFleetSlotDraft(): FleetSlotDraft { + return { + primary: null, + candidates: Array.from( + { length: DEFAULT_BACKUP_SLOT_COUNT }, + () => createFleetCandidateDraft(), + ), + ...createFleetRuleDraft(), + }; +} + +function createFleetDraft(): FleetDraft { + return { + name: '', + file: null, + slots: Array.from( + { length: FLEET_SLOT_COUNT }, + createFleetSlotDraft, + ), + }; +} + +export class FleetPlannerView { + private readonly slotList: HTMLElement; + private readonly backupSlotList: HTMLElement; + private readonly gallery: HTMLElement; + private readonly countLabel: HTMLElement; + private readonly searchInput: HTMLInputElement; + private readonly filterButtons: HTMLButtonElement[]; + private readonly filterCount: HTMLElement; + private readonly filterPopover: HTMLElement; + private readonly typeOptions: HTMLElement; + private readonly countryOptions: HTMLElement; + private readonly refitFilter: HTMLInputElement; + private readonly sortDescending: HTMLInputElement; + private readonly presetNameInput: HTMLInputElement; + private readonly levelEnabled: HTMLInputElement; + private readonly levelFields: HTMLElement; + private readonly minLevel: HTMLInputElement; + private readonly maxLevel: HTMLInputElement; + private readonly backupLevelEnabled: HTMLInputElement; + private readonly backupLevelFields: HTMLElement; + private readonly backupMinLevel: HTMLInputElement; + private readonly backupMaxLevel: HTMLInputElement; + private readonly backupTitle: HTMLElement; + private readonly backupAppendDrop: HTMLElement; + private readonly galleryResizeObserver: ResizeObserver; + + private manifest: ShipLibraryManifest | null = null; + private labels: ShipLibraryLabels = EMPTY_LABELS; + private ships: ShipLibraryShip[] = []; + private visibleShips: ShipLibraryShip[] = []; + private colorfulBackgroundUrl = ''; + private renderedShipCount = 0; + private loading: Promise | null = null; + + private activeSlotGroup: SlotGroup = 'formation'; + private activePosition = 0; + private activeBackupIndex = 0; + private fleet = createFleetDraft(); + private savedFleetSnapshot = ''; + + private groupFilter: string | null = 'all'; + private typeFilters = new Set(); + private countryFilters = new Set(); + private refitOnly = false; + private sortField: SortField = 'id'; + private descending = false; + private searchText = ''; + + constructor() { + this.slotList = document.getElementById('fleet-slot-list')!; + this.backupSlotList = document.getElementById('fleet-backup-slot-list')!; + this.gallery = document.getElementById('fleet-ship-gallery')!; + this.countLabel = document.getElementById('fleet-library-count')!; + this.searchInput = document.getElementById('fleet-ship-search') as HTMLInputElement; + this.filterButtons = Array.from( + document.querySelectorAll('[data-fleet-filter-trigger]'), + ); + this.filterCount = document.getElementById('fleet-filter-count')!; + this.filterPopover = document.getElementById('fleet-filter-popover')!; + this.typeOptions = document.getElementById('fleet-filter-types')!; + this.countryOptions = document.getElementById('fleet-filter-countries')!; + this.refitFilter = document.getElementById( + 'fleet-filter-refit-only', + ) as HTMLInputElement; + this.sortDescending = document.getElementById('fleet-sort-desc') as HTMLInputElement; + this.refitOnly = localStorage.getItem( + REFIT_FILTER_STORAGE_KEY, + ) === 'true'; + this.refitFilter.checked = this.refitOnly; + this.presetNameInput = document.getElementById( + 'fleet-preset-name', + ) as HTMLInputElement; + this.levelEnabled = document.getElementById( + 'fleet-level-enabled', + ) as HTMLInputElement; + this.levelFields = document.getElementById('fleet-level-fields')!; + this.minLevel = document.getElementById('fleet-min-level') as HTMLInputElement; + this.maxLevel = document.getElementById('fleet-max-level') as HTMLInputElement; + this.backupLevelEnabled = document.getElementById( + 'fleet-backup-level-enabled', + ) as HTMLInputElement; + this.backupLevelFields = document.getElementById( + 'fleet-backup-level-fields', + )!; + this.backupMinLevel = document.getElementById( + 'fleet-backup-min-level', + ) as HTMLInputElement; + this.backupMaxLevel = document.getElementById( + 'fleet-backup-max-level', + ) as HTMLInputElement; + this.backupTitle = document.getElementById('fleet-backup-title')!; + this.backupAppendDrop = document.getElementById( + 'fleet-backup-append-drop', + )!; + this.bindActions(); + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.savedFleetSnapshot = this.fleetDraftSnapshot(); + this.galleryResizeObserver = new ResizeObserver( + () => this.ensureGalleryFilled(), + ); + this.galleryResizeObserver.observe(this.gallery); + } + + /** 首次进入页面时加载资料库;更新资料库后可强制刷新。 */ + load(force = false): Promise { + if (this.loading) return this.loading; + if (this.manifest && !force) return Promise.resolve(); + this.loading = this.loadManifest().finally(() => { + this.loading = null; + }); + return this.loading; + } + + private async loadManifest(): Promise { + const bridge = window.electronBridge; + if (!bridge?.getShipLibraryManifest) { + this.showGalleryMessage('当前环境无法读取本地舰船资料库'); + return; + } + this.countLabel.textContent = '正在读取资料库…'; + try { + this.manifest = await bridge.getShipLibraryManifest(); + this.labels = { + ...EMPTY_LABELS, + ...this.manifest.labels, + }; + this.ships = this.manifest.ships.filter((ship) => ( + Number.isFinite(ship.id) + && Boolean(ship.name) + && Boolean(ship.portraitUrl) + )); + this.colorfulBackgroundUrl = this.ships.find( + ship => ship.rarity === 6 && Boolean(ship.backgroundUrl), + )?.backgroundUrl ?? ''; + this.renderFilterOptions(); + this.applyFilters(); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + this.countLabel.textContent = '资料库不可用'; + this.showGalleryMessage(message); + } + } + + private bindActions(): void { + this.slotList.addEventListener('click', (event) => { + const target = event.target as HTMLElement; + const removeButton = target.closest('[data-remove-slot]'); + if (removeButton) { + const slot = Number(removeButton.dataset['removeSlot']); + if (Number.isInteger(slot) && slot >= 0 && slot < FLEET_SLOT_COUNT) { + const slots = this.currentFleet().slots; + const selected = slots[slot]; + selected.primary = null; + this.clearFleetRule(selected); + // 仍有备选时保留位置;主选和备选都为空后才整体左移。 + this.activePosition = this.compactFleetSlots(selected, slot); + this.activeSlotGroup = 'formation'; + this.activeBackupIndex = 0; + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + } + return; + } + const slotButton = target.closest('[data-fleet-slot]'); + if (!slotButton) return; + const slot = Number(slotButton.dataset['fleetSlot']); + if (!Number.isInteger(slot) || slot < 0 || slot >= FLEET_SLOT_COUNT) return; + this.activeSlotGroup = 'formation'; + this.activePosition = slot; + this.activeBackupIndex = 0; + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + }); + this.slotList.addEventListener('dragstart', (event) => { + const slot = (event.target as HTMLElement).closest( + '[data-fleet-slot]', + ); + if (!slot || !event.dataTransfer) return; + const position = Number(slot.dataset['fleetSlot']); + if (!this.currentFleet().slots[position]?.primary) return; + this.activeSlotGroup = 'formation'; + this.activePosition = position; + this.activeBackupIndex = 0; + this.renderBackupSlots(); + this.renderSlotRule(); + this.showBackupAppendDrop(true); + event.dataTransfer.effectAllowed = 'copyMove'; + event.dataTransfer.setData( + FLEET_DRAG_MIME, + JSON.stringify({ source: 'formation', position }), + ); + }); + this.slotList.addEventListener('dragover', (event) => { + const slot = (event.target as HTMLElement).closest( + '[data-fleet-slot]', + ); + if (!slot || !event.dataTransfer?.types.includes(FLEET_DRAG_MIME)) return; + event.preventDefault(); + event.dataTransfer.dropEffect = 'move'; + slot.classList.add('drag-over'); + }); + this.slotList.addEventListener('dragleave', (event) => { + const slot = (event.target as HTMLElement).closest( + '[data-fleet-slot]', + ); + if (slot && !slot.contains(event.relatedTarget as Node | null)) { + slot.classList.remove('drag-over'); + } + }); + this.slotList.addEventListener('drop', (event) => { + const slot = (event.target as HTMLElement).closest( + '[data-fleet-slot]', + ); + if (!slot || !event.dataTransfer) return; + event.preventDefault(); + slot.classList.remove('drag-over'); + const position = Number(slot.dataset['fleetSlot']); + this.handleFleetDrop(event.dataTransfer.getData(FLEET_DRAG_MIME), position); + }); + this.slotList.addEventListener('dragend', () => { + this.slotList.querySelectorAll('.drag-over').forEach((slot) => { + slot.classList.remove('drag-over'); + }); + this.showBackupAppendDrop(false); + }); + + this.backupSlotList.addEventListener('click', (event) => { + const target = event.target as HTMLElement; + const removeButton = target.closest('[data-remove-backup-slot]'); + if (removeButton) { + const slot = Number(removeButton.dataset['removeBackupSlot']); + const candidates = this.currentSlot().candidates; + if (Number.isInteger(slot) && slot >= 0 && slot < candidates.length) { + const owner = this.currentSlot(); + // 第 7 个及以后的扩展槽随卡片一起删除,默认槽位只补足到 6 个。 + candidates.splice(slot, 1); + this.compactCandidates(candidates); + this.activeSlotGroup = 'backup'; + this.activeBackupIndex = Math.min(slot, candidates.length - 1); + if (this.isFleetSlotEmpty(owner)) { + this.activePosition = this.compactFleetSlots( + null, + this.activePosition, + ); + this.activeSlotGroup = 'formation'; + this.activeBackupIndex = 0; + this.renderSlots(); + } + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + } + return; + } + const slotButton = target.closest('[data-backup-slot]'); + if (!slotButton) return; + const slot = Number(slotButton.dataset['backupSlot']); + if ( + !Number.isInteger(slot) + || slot < 0 + || slot >= this.currentSlot().candidates.length + ) { + return; + } + this.activeSlotGroup = 'backup'; + this.activeBackupIndex = slot; + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + }); + this.backupSlotList.addEventListener('dragstart', (event) => { + const slot = (event.target as HTMLElement).closest( + '[data-backup-slot]', + ); + if (!slot || !event.dataTransfer) return; + const candidateIndex = Number(slot.dataset['backupSlot']); + if (!this.currentSlot().candidates[candidateIndex]?.ship) return; + event.dataTransfer.effectAllowed = 'copyMove'; + event.dataTransfer.setData( + FLEET_DRAG_MIME, + JSON.stringify({ + source: 'backup', + position: this.activePosition, + candidateIndex, + }), + ); + }); + this.backupSlotList.addEventListener('dragover', (event) => { + const slot = (event.target as HTMLElement).closest( + '[data-backup-slot]', + ); + if (!slot || !event.dataTransfer?.types.includes(FLEET_DRAG_MIME)) return; + event.preventDefault(); + event.dataTransfer.dropEffect = 'move'; + slot.classList.add('drag-over'); + }); + this.backupSlotList.addEventListener('dragleave', (event) => { + const slot = (event.target as HTMLElement).closest( + '[data-backup-slot]', + ); + if (slot && !slot.contains(event.relatedTarget as Node | null)) { + slot.classList.remove('drag-over'); + } + }); + this.backupSlotList.addEventListener('drop', (event) => { + const slot = (event.target as HTMLElement).closest( + '[data-backup-slot]', + ); + if (!slot || !event.dataTransfer) return; + event.preventDefault(); + slot.classList.remove('drag-over'); + this.handleBackupDrop( + event.dataTransfer.getData(FLEET_DRAG_MIME), + Number(slot.dataset['backupSlot']), + ); + }); + this.backupSlotList.addEventListener('dragend', () => { + this.backupSlotList.querySelectorAll('.drag-over').forEach((slot) => { + slot.classList.remove('drag-over'); + }); + }); + this.backupAppendDrop.addEventListener('dragover', (event) => { + if (!event.dataTransfer?.types.includes(FLEET_DRAG_MIME)) return; + event.preventDefault(); + event.dataTransfer.dropEffect = 'move'; + this.backupAppendDrop.classList.add('drag-over'); + }); + this.backupAppendDrop.addEventListener('dragleave', () => { + this.backupAppendDrop.classList.remove('drag-over'); + }); + this.backupAppendDrop.addEventListener('drop', (event) => { + if (!event.dataTransfer) return; + event.preventDefault(); + this.backupAppendDrop.classList.remove('drag-over'); + this.handleBackupAppendDrop( + event.dataTransfer.getData(FLEET_DRAG_MIME), + ); + this.showBackupAppendDrop(false); + }); + + this.gallery.addEventListener('click', (event) => { + const card = (event.target as HTMLElement).closest('[data-ship-id]'); + if (!card) return; + const shipId = Number(card.dataset['shipId']); + const ship = this.ships.find((item) => item.id === shipId); + if (ship) this.assignShip(ship); + }); + this.gallery.addEventListener('dragstart', (event) => { + const card = (event.target as HTMLElement).closest( + '[data-ship-id]', + ); + if (!card || !event.dataTransfer) return; + event.dataTransfer.effectAllowed = 'copyMove'; + event.dataTransfer.setData( + FLEET_DRAG_MIME, + JSON.stringify({ source: 'gallery', shipId: Number(card.dataset['shipId']) }), + ); + }); + this.gallery.addEventListener('scroll', () => { + const remaining = this.gallery.scrollHeight + - this.gallery.scrollTop + - this.gallery.clientHeight; + if (remaining < 480) this.appendGalleryBatch(); + }); + + this.searchInput.addEventListener('input', () => { + this.searchText = this.searchInput.value; + this.applyFilters(); + }); + + this.filterButtons.forEach((button) => { + button.addEventListener('click', (event) => { + event.stopPropagation(); + this.setFilterPopoverOpen( + this.filterPopover.hidden ? 'filter' : null, + ); + }); + }); + this.filterPopover.addEventListener('click', (event) => { + const option = (event.target as HTMLElement).closest( + '[data-filter-kind]', + ); + if (option) { + this.setFilter( + option.dataset['filterKind'] as FilterKind, + option.dataset['filterValue'] ?? 'all', + ); + } + const sortOption = (event.target as HTMLElement).closest( + '[data-sort-field]', + ); + if (sortOption) { + this.sortField = sortOption.dataset['sortField'] as SortField; + this.updateFilterControls(); + this.applyFilters(); + } + }); + document.addEventListener('click', (event) => { + const target = event.target as Node; + if ( + !this.filterPopover.hidden + && !this.filterPopover.contains(target) + && !this.filterButtons.some((button) => button.contains(target)) + ) { + this.setFilterPopoverOpen(null); + } + }); + document.addEventListener('keydown', (event) => { + if (event.key === 'Escape') this.setFilterPopoverOpen(null); + }); + document.getElementById('btn-confirm-fleet-filter')?.addEventListener( + 'click', + () => this.setFilterPopoverOpen(null), + ); + + this.sortDescending.addEventListener('change', () => { + this.updateFilterControls(); + this.applyFilters(); + }); + this.refitFilter.addEventListener('change', () => { + this.refitOnly = this.refitFilter.checked; + localStorage.setItem( + REFIT_FILTER_STORAGE_KEY, + String(this.refitOnly), + ); + this.updateFilterControls(); + this.applyFilters(); + }); + + document.getElementById('btn-reset-fleet-filter')?.addEventListener('click', () => { + this.groupFilter = 'all'; + this.typeFilters.clear(); + this.countryFilters.clear(); + this.refitOnly = false; + localStorage.setItem(REFIT_FILTER_STORAGE_KEY, 'false'); + this.sortField = 'id'; + this.descending = false; + this.updateFilterControls(); + this.applyFilters(); + }); + + document.getElementById('btn-clear-fleet')?.addEventListener('click', () => { + const current = this.currentFleet(); + current.slots = Array.from( + { length: FLEET_SLOT_COUNT }, + createFleetSlotDraft, + ); + current.file = null; + this.activeSlotGroup = 'formation'; + this.activePosition = 0; + this.activeBackupIndex = 0; + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + }); + + document.getElementById('btn-add-fleet-backup')?.addEventListener('click', () => { + const candidates = this.currentSlot().candidates; + let target = candidates.findIndex(candidate => candidate.ship === null); + if (target < 0) { + candidates.push(createFleetCandidateDraft()); + target = candidates.length - 1; + } + this.activeSlotGroup = 'backup'; + this.activeBackupIndex = target; + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + requestAnimationFrame(() => { + this.backupSlotList.querySelector( + `[data-backup-slot="${target}"]`, + )?.scrollIntoView({ + block: 'nearest', + inline: 'nearest', + behavior: 'smooth', + }); + }); + }); + + this.presetNameInput.addEventListener('input', () => { + this.currentFleet().name = this.presetNameInput.value; + this.currentFleet().file = null; + }); + this.levelEnabled.addEventListener('change', () => { + this.currentSlot().levelEnabled = this.levelEnabled.checked; + this.levelFields.hidden = !this.levelEnabled.checked; + }); + this.minLevel.addEventListener('input', () => { + const rule = this.currentSlot(); + rule.minLevel = this.readLevel(this.minLevel); + this.updateLevelValidity(rule, this.minLevel, this.maxLevel); + }); + this.maxLevel.addEventListener('input', () => { + const rule = this.currentSlot(); + rule.maxLevel = this.readLevel(this.maxLevel); + this.updateLevelValidity(rule, this.minLevel, this.maxLevel); + }); + this.backupLevelEnabled.addEventListener('change', () => { + this.currentBackupRule().levelEnabled = this.backupLevelEnabled.checked; + this.backupLevelFields.hidden = !this.backupLevelEnabled.checked; + }); + this.backupMinLevel.addEventListener('input', () => { + const rule = this.currentBackupRule(); + rule.minLevel = this.readLevel(this.backupMinLevel); + this.updateLevelValidity(rule, this.backupMinLevel, this.backupMaxLevel); + }); + this.backupMaxLevel.addEventListener('input', () => { + const rule = this.currentBackupRule(); + rule.maxLevel = this.readLevel(this.backupMaxLevel); + this.updateLevelValidity(rule, this.backupMinLevel, this.backupMaxLevel); + }); + + document.getElementById('btn-save-team-plan')?.addEventListener('click', () => { + void this.saveCurrentTeamPlan(); + }); + document.getElementById('btn-load-team-plan')?.addEventListener('click', () => { + void this.loadTeamPlan(); + }); + } + + private setFilter(kind: FilterKind, value: string): void { + if (kind === 'group') { + this.groupFilter = value; + this.typeFilters.clear(); + if (value !== 'all') { + this.ships.forEach((ship) => { + if ( + (ship.size_class === value || ship.role_class === value) + && SHIP_TYPE_FILTER_ORDER.includes(ship.ship_type) + ) { + this.typeFilters.add(ship.ship_type); + } + }); + } + } else { + const filters = kind === 'type' + ? this.typeFilters + : this.countryFilters; + if (kind === 'type') this.groupFilter = null; + if (value === 'all') { + filters.clear(); + } else if (filters.has(value)) { + filters.delete(value); + } else { + filters.add(value); + } + } + this.updateFilterControls(); + this.applyFilters(); + } + + private setFilterPopoverOpen(target: 'filter' | null): void { + this.filterPopover.hidden = target !== 'filter'; + this.filterButtons.forEach((button) => { + button.setAttribute( + 'aria-expanded', + String(button.dataset['fleetFilterTrigger'] === target), + ); + }); + } + + private renderFilterOptions(): void { + this.typeOptions.replaceChildren( + this.createFilterOption('type', 'all', '全部'), + ...SHIP_TYPE_FILTER_ORDER + .filter(code => this.labels.ship_types[code] !== undefined) + .map(code => this.createFilterOption( + 'type', + code, + SHIP_TYPE_SHORT_NAMES[code] ?? this.labels.ship_types[code]!, + )), + ); + this.countryOptions.replaceChildren( + this.createFilterOption('country', 'all', '全部'), + ...Object.entries(this.labels.countries) + .map(([code, label]) => this.createFilterOption('country', code, label)), + ); + this.renderSlotRule(); + this.updateFilterControls(); + } + + private createFilterOption( + kind: FilterKind, + value: string, + label: string, + ): HTMLButtonElement { + const button = document.createElement('button'); + button.type = 'button'; + button.className = 'fleet-filter-option'; + button.dataset['filterKind'] = kind; + button.dataset['filterValue'] = value; + button.setAttribute('aria-pressed', 'false'); + button.textContent = label; + return button; + } + + private updateFilterControls(): void { + this.filterPopover.querySelectorAll('[data-filter-kind]').forEach((item) => { + const kind = item.dataset['filterKind']; + const value = item.dataset['filterValue'] ?? 'all'; + const active = kind === 'group' + ? value === this.groupFilter + : kind === 'type' + ? value === 'all' + ? this.typeFilters.size === 0 + : this.typeFilters.has(value) + : value === 'all' + ? this.countryFilters.size === 0 + : this.countryFilters.has(value); + item.classList.toggle('active', active); + item.setAttribute('aria-pressed', String(active)); + }); + this.filterPopover.querySelectorAll('[data-sort-field]').forEach((item) => { + item.classList.toggle('active', item.dataset['sortField'] === this.sortField); + }); + this.sortDescending.checked = this.descending; + this.refitFilter.checked = this.refitOnly; + const activeFilterCount = [ + this.typeFilters.size > 0, + this.countryFilters.size > 0, + this.refitOnly, + ].filter(Boolean).length; + this.filterCount.textContent = activeFilterCount > 0 + ? String(activeFilterCount) + : ''; + + this.filterButtons.forEach((button) => { + const active = activeFilterCount > 0 + || this.sortField !== 'id' + || this.descending; + button.classList.toggle('active', active); + }); + } + + private applyFilters(resetScroll = true): void { + const previousScrollTop = resetScroll ? 0 : this.gallery.scrollTop; + const search = this.normalizeSearch(this.searchText); + const selectedIds = new Set(this.selectedShips().map(ship => ship.id)); + const refitSearchNames = this.refitOnly + ? new Set( + this.ships + .filter(ship => ship.variant === 'refit') + .map(ship => ship.search_name), + ) + : null; + this.visibleShips = this.ships.filter((ship) => { + const typeMatches = this.typeFilters.size === 0 + || this.typeFilters.has(ship.ship_type); + const countryMatches = this.countryFilters.size === 0 + || this.countryFilters.has(ship.country); + const refitMatches = refitSearchNames === null + || ship.variant === 'refit' + || !refitSearchNames.has(ship.search_name); + const searchMatches = !search || [ + ship.name, + ship.search_name, + String(ship.id), + this.labels.ship_types[ship.ship_type] ?? '', + ship.ship_type, + ].some((value) => this.normalizeSearch(value).includes(search)); + return !selectedIds.has(ship.id) + && typeMatches + && countryMatches + && refitMatches + && searchMatches; + }); + + const direction = this.descending ? -1 : 1; + this.visibleShips.sort((left, right) => { + let result = 0; + if (this.sortField === 'name') { + result = left.name.localeCompare(right.name, 'zh-CN'); + } else if (this.sortField === 'type') { + const leftType = this.labels.ship_types[left.ship_type] ?? left.ship_type; + const rightType = this.labels.ship_types[right.ship_type] ?? right.ship_type; + result = leftType.localeCompare(rightType, 'zh-CN'); + } else { + result = left.id - right.id; + } + return (result || left.id - right.id) * direction; + }); + + this.countLabel.textContent = `显示 ${this.visibleShips.length} / ${this.ships.length} 艘`; + this.renderedShipCount = 0; + this.gallery.replaceChildren(); + if (this.visibleShips.length === 0) { + this.showGalleryMessage('没有符合当前条件的舰娘'); + return; + } + this.appendGalleryBatch(); + this.gallery.scrollTop = previousScrollTop; + } + + /** 根据当前图鉴宽高计算首屏和下一批需要的卡片数量。 */ + private galleryBatchSize(): number { + const columns = Math.max( + 1, + Math.floor( + (this.gallery.clientWidth + GALLERY_GAP) + / (GALLERY_CARD_WIDTH + GALLERY_GAP), + ), + ); + const visibleRows = Math.max( + 1, + Math.ceil( + (this.gallery.clientHeight + GALLERY_GAP) + / (GALLERY_CARD_HEIGHT + GALLERY_GAP), + ), + ); + return Math.max( + MIN_GALLERY_BATCH_SIZE, + columns * (visibleRows + 2), + ); + } + + /** 分辨率变大时补齐新增列和可见行,不重建图鉴也不改变滚动位置。 */ + private ensureGalleryFilled(): void { + if (this.visibleShips.length === 0) return; + const missingCount = this.galleryBatchSize() - this.renderedShipCount; + if (missingCount > 0) this.appendGalleryBatch(missingCount); + } + + private appendGalleryBatch(count = this.galleryBatchSize()): void { + if (this.renderedShipCount >= this.visibleShips.length) return; + const scrollTop = this.gallery.scrollTop; + const fragment = document.createDocumentFragment(); + const end = Math.min( + this.renderedShipCount + count, + this.visibleShips.length, + ); + for (let index = this.renderedShipCount; index < end; index += 1) { + fragment.append(this.createShipCard(this.visibleShips[index])); + } + this.renderedShipCount = end; + this.gallery.append(fragment); + this.gallery.scrollTop = scrollTop; + } + + private createShipCard(ship: ShipLibraryShip): HTMLButtonElement { + const card = document.createElement('button'); + card.type = 'button'; + card.className = 'fleet-ship-card'; + card.dataset['shipId'] = String(ship.id); + card.draggable = true; + card.title = `将 ${ship.name} 放入${this.activeSlotDescription()}`; + card.append(this.createShipArtwork(ship)); + return card; + } + + /** 创建图鉴、编队和备选编队共用的 Wiki 比例舰娘展示框。 */ + private createShipArtwork(ship: ShipLibraryShip): HTMLSpanElement { + const artwork = document.createElement('span'); + artwork.className = 'fleet-ship-artwork'; + + if (ship.backgroundUrl) { + const background = document.createElement('img'); + background.className = 'fleet-ship-background'; + background.src = ship.backgroundUrl; + background.alt = ''; + background.loading = 'lazy'; + background.draggable = false; + artwork.append(background); + } + + const portraitWindow = document.createElement('span'); + portraitWindow.className = 'fleet-ship-portrait-window'; + const portrait = document.createElement('img'); + portrait.className = 'fleet-ship-portrait'; + portrait.src = ship.portraitUrl; + portrait.alt = ship.name; + portrait.loading = 'lazy'; + portrait.draggable = false; + portraitWindow.append(portrait); + artwork.append(portraitWindow); + + if (ship.frameUrl) { + const frame = document.createElement('img'); + frame.className = 'fleet-ship-frame'; + frame.src = ship.frameUrl; + frame.alt = ''; + frame.loading = 'lazy'; + frame.draggable = false; + artwork.append(frame); + } + + const number = document.createElement('span'); + number.className = 'fleet-ship-number'; + number.textContent = `No.${String(ship.id).padStart(3, '0')}`; + artwork.append(number); + + if (ship.typeIconUrl) { + const typeIcon = document.createElement('img'); + typeIcon.className = 'fleet-ship-type-icon'; + typeIcon.src = ship.typeIconUrl; + typeIcon.alt = this.shipTypeDisplay(ship); + typeIcon.loading = 'lazy'; + typeIcon.draggable = false; + artwork.append(typeIcon); + } + + const name = document.createElement('span'); + name.className = 'fleet-ship-name'; + const nameText = document.createElement('strong'); + nameText.className = `fleet-ship-name-text rarity-${ + Math.max(1, Math.min(6, ship.rarity)) + }`; + nameText.textContent = ship.name; + name.append(nameText); + artwork.append(name); + return artwork; + } + + private activeSlotDescription(): string { + if (this.activeSlotGroup === 'formation') { + return `编队位置 ${this.activePosition + 1}`; + } + return `位置 ${this.activePosition + 1} 的第 ${ + this.activeBackupIndex + 1 + } 个备选槽位`; + } + + private assignShip(ship: ShipLibraryShip): void { + if (this.activeSlotGroup === 'formation') { + const existingPrimary = this.currentFleet().slots.findIndex( + slot => slot.primary?.search_name === ship.search_name, + ); + this.assignFormationShip( + ship, + existingPrimary >= 0 ? existingPrimary : this.activePosition, + ); + } else { + const slot = this.currentSlot(); + const existingBackup = slot.candidates.findIndex( + candidate => candidate.ship?.search_name === ship.search_name, + ); + if (existingBackup >= 0) { + slot.candidates[existingBackup].ship = ship; + this.applyDefaultShipType(slot.candidates[existingBackup], ship); + this.activeBackupIndex = existingBackup; + } else { + const selected = slot.candidates[this.activeBackupIndex]; + const replacing = Boolean(selected?.ship); + const firstEmpty = slot.candidates.findIndex( + candidate => candidate.ship === null, + ); + const target = (selected?.ship || firstEmpty < 0) + ? this.activeBackupIndex + : firstEmpty; + if (!slot.candidates[target]) { + slot.candidates.push(createFleetCandidateDraft()); + } + const candidate = slot.candidates[target]; + candidate.ship = ship; + this.applyDefaultShipType(candidate, ship); + this.activeBackupIndex = target; + // 替换后保留当前焦点;只有从空槽追加时才推进到下一个空槽。 + if (!replacing) { + const nextEmpty = slot.candidates.findIndex( + (item, index) => index > target && item.ship === null, + ); + if (nextEmpty >= 0) this.activeBackupIndex = nextEmpty; + } + } + } + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + } + + private assignFormationShip( + ship: ShipLibraryShip, + position: number, + sourceRule?: FleetRuleDraft, + advanceToNextEmpty = true, + ): void { + const slots = this.currentFleet().slots; + const firstEmpty = slots.findIndex(slot => this.isFleetSlotEmpty(slot)); + const requested = slots[position]; + const target = ( + requested.primary + || !this.isFleetSlotEmpty(requested) + || firstEmpty < 0 + ) + ? position + : firstEmpty; + const slot = slots[target]; + const replacing = slot.primary !== null; + slot.primary = ship; + if (sourceRule) this.copyFleetRule(slot, sourceRule); + this.applyDefaultShipType(slot, ship); + this.activeSlotGroup = 'formation'; + this.activePosition = target; + this.activeBackupIndex = 0; + if (!replacing && advanceToNextEmpty) { + const nextEmpty = slots.findIndex( + (current, index) => ( + index > target && this.isFleetSlotEmpty(current) + ), + ); + if (nextEmpty >= 0) this.activePosition = nextEmpty; + } + } + + private handleFleetDrop(raw: string, targetPosition: number): void { + if (!raw || targetPosition < 0 || targetPosition >= FLEET_SLOT_COUNT) return; + try { + const data = JSON.parse(raw) as FleetDragData; + if ( + data.source === 'formation' + && Number.isInteger(data.position) + && data.position! >= 0 + && data.position! < FLEET_SLOT_COUNT + ) { + const sourcePosition = data.position!; + const moved = this.moveFormationSlot(sourcePosition, targetPosition); + if (!moved) return; + this.activeSlotGroup = 'formation'; + this.activePosition = Math.max( + 0, + this.currentFleet().slots.indexOf(moved), + ); + this.activeBackupIndex = 0; + } else if ( + data.source === 'backup' + && Number.isInteger(data.position) + && Number.isInteger(data.candidateIndex) + ) { + if (!this.moveBackupToFormation(data, targetPosition)) return; + } else { + const dragged = this.draggedShipRule(data); + if (!dragged) return; + const existing = this.currentFleet().slots.findIndex( + slot => slot.primary?.search_name === dragged.ship.search_name, + ); + this.assignFormationShip( + dragged.ship, + existing >= 0 ? existing : targetPosition, + existing < 0 ? dragged.rule : undefined, + false, + ); + } + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + this.showBackupAppendDrop(false); + } catch { + // 忽略非本页面产生的拖拽数据。 + } + } + + private handleBackupDrop(raw: string, targetIndex: number): void { + const candidates = this.currentSlot().candidates; + if (!raw || targetIndex < 0 || targetIndex >= candidates.length) return; + try { + const data = JSON.parse(raw) as FleetDragData; + if ( + data.source === 'formation' + && Number.isInteger(data.position) + ) { + if (!this.moveFormationToBackup(data.position!, targetIndex)) return; + } else if ( + data.source === 'backup' + && Number.isInteger(data.position) + && Number.isInteger(data.candidateIndex) + ) { + if (!this.moveBackupCandidate(data, targetIndex)) return; + } else { + const dragged = this.draggedShipRule(data); + if (!dragged) return; + const existing = candidates.findIndex( + candidate => candidate.ship?.search_name === dragged.ship.search_name, + ); + const firstEmpty = candidates.findIndex( + candidate => candidate.ship === null, + ); + const index = existing >= 0 + ? existing + : (candidates[targetIndex].ship ? targetIndex : firstEmpty); + const selected = candidates[index]; + selected.ship = dragged.ship; + this.applyDefaultShipType(selected, dragged.ship); + this.compactCandidates(candidates); + this.activeSlotGroup = 'backup'; + this.activeBackupIndex = Math.max(0, candidates.indexOf(selected)); + } + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + this.showBackupAppendDrop(false); + } catch { + // 忽略非本页面产生的拖拽数据。 + } + } + + private moveFormationSlot( + sourcePosition: number, + targetPosition: number, + ): FleetSlotDraft | null { + const slots = this.currentFleet().slots; + const moved = slots[sourcePosition]; + if (!moved?.primary) return null; + if (sourcePosition === targetPosition) return moved; + + if (!this.isFleetSlotEmpty(slots[targetPosition])) { + [slots[sourcePosition], slots[targetPosition]] = [ + slots[targetPosition], + moved, + ]; + return moved; + } + + // 拖向空槽时,将完整位置对象放到已占用位置末尾,备选规则不会被拆散。 + slots.splice(sourcePosition, 1); + const firstEmpty = slots.findIndex(slot => this.isFleetSlotEmpty(slot)); + slots.splice(firstEmpty < 0 ? slots.length : firstEmpty, 0, moved); + return moved; + } + + private moveBackupToFormation( + data: FleetDragData, + targetPosition: number, + ): boolean { + const slots = this.currentFleet().slots; + const sourceSlot = slots[data.position!]; + const targetSlot = slots[targetPosition]; + const sourceIndex = data.candidateIndex!; + const candidate = sourceSlot?.candidates[sourceIndex]; + if (!candidate?.ship || !targetSlot) return false; + + if (targetSlot.primary) { + this.swapPrimaryAndCandidate(targetSlot, sourceSlot, sourceIndex); + } else { + targetSlot.primary = candidate.ship; + this.copyFleetRule(targetSlot, candidate); + sourceSlot.candidates.splice(sourceIndex, 1); + this.compactCandidates(sourceSlot.candidates); + if (this.isFleetSlotEmpty(sourceSlot)) { + this.compactFleetSlots(null, data.position!); + } + } + + this.activeSlotGroup = 'formation'; + this.activePosition = Math.max(0, slots.indexOf(targetSlot)); + this.activeBackupIndex = 0; + return true; + } + + private moveFormationToBackup( + sourcePosition: number, + targetIndex: number, + ): boolean { + const sourceSlot = this.currentFleet().slots[sourcePosition]; + const targetSlot = this.currentSlot(); + const target = targetSlot.candidates[targetIndex]; + if (!sourceSlot?.primary || !target) return false; + + let selected: FleetCandidateDraft; + if (target.ship) { + selected = this.swapPrimaryAndCandidate( + sourceSlot, + targetSlot, + targetIndex, + ); + } else { + selected = this.appendFormationToBackup(sourceSlot, targetSlot); + } + + this.activeSlotGroup = 'backup'; + this.activePosition = Math.max( + 0, + this.currentFleet().slots.indexOf(targetSlot), + ); + this.activeBackupIndex = Math.max( + 0, + targetSlot.candidates.indexOf(selected), + ); + return true; + } + + private moveBackupCandidate( + data: FleetDragData, + targetIndex: number, + ): boolean { + const slots = this.currentFleet().slots; + const sourceSlot = slots[data.position!]; + const targetSlot = this.currentSlot(); + const sourceIndex = data.candidateIndex!; + const selected = sourceSlot?.candidates[sourceIndex]; + const target = targetSlot.candidates[targetIndex]; + if (!selected?.ship || !target) return false; + + if (sourceSlot === targetSlot) { + [sourceSlot.candidates[sourceIndex], sourceSlot.candidates[targetIndex]] = [ + sourceSlot.candidates[targetIndex], + selected, + ]; + this.compactCandidates(sourceSlot.candidates); + } else if (target.ship) { + [sourceSlot.candidates[sourceIndex], targetSlot.candidates[targetIndex]] = [ + target, + selected, + ]; + this.compactCandidates(sourceSlot.candidates); + this.compactCandidates(targetSlot.candidates); + } else { + targetSlot.candidates[targetIndex] = selected; + sourceSlot.candidates[sourceIndex] = createFleetCandidateDraft(); + this.compactCandidates(sourceSlot.candidates); + this.compactCandidates(targetSlot.candidates); + if (this.isFleetSlotEmpty(sourceSlot)) { + this.compactFleetSlots(null, data.position!); + } + } + + this.activeSlotGroup = 'backup'; + this.activePosition = Math.max(0, slots.indexOf(targetSlot)); + this.activeBackupIndex = Math.max( + 0, + targetSlot.candidates.indexOf(selected), + ); + return true; + } + + private handleBackupAppendDrop(raw: string): void { + if (!raw) return; + try { + const data = JSON.parse(raw) as FleetDragData; + if ( + data.source !== 'formation' + || !Number.isInteger(data.position) + ) { + return; + } + const sourceSlot = this.currentFleet().slots[data.position!]; + const targetSlot = this.currentSlot(); + if (!sourceSlot?.primary) return; + const selected = this.appendFormationToBackup(sourceSlot, targetSlot); + this.activeSlotGroup = 'backup'; + this.activePosition = Math.max( + 0, + this.currentFleet().slots.indexOf(targetSlot), + ); + this.activeBackupIndex = Math.max( + 0, + targetSlot.candidates.indexOf(selected), + ); + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + } catch { + // 忽略非本页面产生的拖拽数据。 + } + } + + private appendFormationToBackup( + sourceSlot: FleetSlotDraft, + targetSlot: FleetSlotDraft, + ): FleetCandidateDraft { + const ship = sourceSlot.primary!; + const rule = this.cloneFleetRule(sourceSlot); + const selected = this.appendBackupCandidate(targetSlot, ship, rule); + sourceSlot.primary = null; + this.clearFleetRule(sourceSlot); + if (this.isFleetSlotEmpty(sourceSlot)) { + this.compactFleetSlots(null, this.activePosition); + } + return selected; + } + + private appendBackupCandidate( + targetSlot: FleetSlotDraft, + ship: ShipLibraryShip, + rule: FleetRuleDraft, + ): FleetCandidateDraft { + const occupied = targetSlot.candidates.filter(candidate => ( + candidate.ship !== null + && candidate.ship.search_name !== ship.search_name + )); + const selected = createFleetCandidateDraft(ship); + this.copyFleetRule(selected, rule); + occupied.push(selected); + targetSlot.candidates.splice( + 0, + targetSlot.candidates.length, + ...occupied, + ...Array.from( + { + length: Math.max( + 0, + DEFAULT_BACKUP_SLOT_COUNT - occupied.length, + ), + }, + () => createFleetCandidateDraft(), + ), + ); + return selected; + } + + private swapPrimaryAndCandidate( + primarySlot: FleetSlotDraft, + candidateSlot: FleetSlotDraft, + candidateIndex: number, + ): FleetCandidateDraft { + const primary = primarySlot.primary!; + const primaryRule = this.cloneFleetRule(primarySlot); + const candidate = candidateSlot.candidates[candidateIndex]; + const promoted = candidate.ship!; + const promotedRule = this.cloneFleetRule(candidate); + + primarySlot.primary = promoted; + this.copyFleetRule(primarySlot, promotedRule); + candidate.ship = primary; + this.copyFleetRule(candidate, primaryRule); + return candidate; + } + + private cloneFleetRule(source: FleetRuleDraft): FleetRuleDraft { + return { + shipTypes: [...source.shipTypes], + levelEnabled: source.levelEnabled, + minLevel: source.minLevel, + maxLevel: source.maxLevel, + }; + } + + private clearFleetRule(target: FleetRuleDraft): void { + this.copyFleetRule(target, createFleetRuleDraft()); + } + + private isFleetSlotEmpty(slot: FleetSlotDraft): boolean { + return slot.primary === null + && slot.candidates.every(candidate => candidate.ship === null); + } + + private compactFleetSlots( + preferred: FleetSlotDraft | null, + fallbackPosition: number, + ): number { + const slots = this.currentFleet().slots; + const occupied = slots.filter(slot => !this.isFleetSlotEmpty(slot)); + slots.splice( + 0, + slots.length, + ...occupied, + ...Array.from( + { length: Math.max(0, FLEET_SLOT_COUNT - occupied.length) }, + createFleetSlotDraft, + ), + ); + const preferredPosition = preferred ? slots.indexOf(preferred) : -1; + return preferredPosition >= 0 + ? preferredPosition + : Math.min(Math.max(0, fallbackPosition), FLEET_SLOT_COUNT - 1); + } + + private showBackupAppendDrop(visible: boolean): void { + this.backupAppendDrop.hidden = !visible; + if (!visible) this.backupAppendDrop.classList.remove('drag-over'); + } + + private draggedShipRule( + data: FleetDragData, + ): { ship: ShipLibraryShip; rule?: FleetRuleDraft } | null { + if (data.source === 'gallery' && Number.isInteger(data.shipId)) { + const ship = this.ships.find(item => item.id === data.shipId); + return ship ? { ship } : null; + } + + if ( + data.source === 'formation' + && Number.isInteger(data.position) + && data.position! >= 0 + && data.position! < FLEET_SLOT_COUNT + ) { + const rule = this.currentFleet().slots[data.position!]; + return rule.primary ? { ship: rule.primary, rule } : null; + } + + if ( + data.source === 'backup' + && Number.isInteger(data.position) + && data.position! >= 0 + && data.position! < FLEET_SLOT_COUNT + && Number.isInteger(data.candidateIndex) + ) { + const rule = this.currentFleet() + .slots[data.position!] + .candidates[data.candidateIndex!]; + return rule?.ship ? { ship: rule.ship, rule } : null; + } + + return null; + } + + private copyFleetRule( + target: FleetRuleDraft, + source: FleetRuleDraft, + ): void { + target.shipTypes = [...source.shipTypes]; + target.levelEnabled = source.levelEnabled; + target.minLevel = source.minLevel; + target.maxLevel = source.maxLevel; + } + + private compactCandidates(candidates: FleetCandidateDraft[]): void { + const occupied = candidates.filter(candidate => candidate.ship !== null); + const slotCount = Math.max(DEFAULT_BACKUP_SLOT_COUNT, occupied.length); + candidates.splice( + 0, + candidates.length, + ...occupied, + ...Array.from( + { length: slotCount - occupied.length }, + () => createFleetCandidateDraft(), + ), + ); + } + + private renderSlots(): void { + const fragment = document.createDocumentFragment(); + this.currentFleet().slots.forEach((slot, index) => { + fragment.append(this.createFleetSlot( + slot.primary, + index, + 'formation', + slot.primary === null && !this.isFleetSlotEmpty(slot), + )); + }); + this.slotList.replaceChildren(fragment); + } + + private renderBackupSlots(): void { + const fragment = document.createDocumentFragment(); + this.currentSlot().candidates.forEach((candidate, index) => { + fragment.append(this.createFleetSlot(candidate.ship, index, 'backup')); + }); + this.backupSlotList.replaceChildren(fragment); + const primary = this.currentSlot().primary; + this.backupTitle.textContent = primary + ? `【${primary.name}】的备选队列` + : `【位置${this.activePosition + 1}】的备选列表`; + } + + private createFleetSlot( + ship: ShipLibraryShip | null, + index: number, + group: SlotGroup, + candidateOnly = false, + ): HTMLButtonElement { + const slot = document.createElement('button'); + slot.type = 'button'; + slot.className = `fleet-slot fleet-${group}-slot`; + if (group === 'formation') { + slot.dataset['fleetSlot'] = String(index); + } else { + slot.dataset['backupSlot'] = String(index); + } + const active = group === 'formation' + ? index === this.activePosition + : this.activeSlotGroup === 'backup' && index === this.activeBackupIndex; + slot.classList.toggle('active', active); + slot.classList.toggle('candidate-only', candidateOnly); + slot.draggable = Boolean(ship); + if (candidateOnly) { + slot.setAttribute( + 'aria-label', + `位置 ${index + 1} 没有主选,已有备选舰船`, + ); + if (this.colorfulBackgroundUrl) { + const background = document.createElement('img'); + background.className = 'fleet-slot-placeholder-background'; + background.src = this.colorfulBackgroundUrl; + background.alt = ''; + background.draggable = false; + slot.append(background); + } + } + + if (ship) { + slot.append(this.createShipArtwork(ship)); + const remove = document.createElement('span'); + remove.className = 'fleet-slot-remove'; + if (group === 'formation') { + remove.dataset['removeSlot'] = String(index); + } else { + remove.dataset['removeBackupSlot'] = String(index); + } + remove.setAttribute('role', 'button'); + remove.setAttribute('aria-label', `移除 ${ship.name}`); + remove.textContent = '×'; + slot.append(remove); + } else { + const empty = document.createElement('span'); + empty.className = 'fleet-slot-empty'; + empty.textContent = candidateOnly + ? '使用备选队列' + : group === 'formation' + ? `位置 ${index + 1}` + : `备选 ${index + 1}`; + slot.append(empty); + } + return slot; + } + + private renderGallerySelection(): void { + this.applyFilters(false); + } + + private currentFleet(): FleetDraft { + return this.fleet; + } + + private currentSlot(): FleetSlotDraft { + return this.currentFleet().slots[this.activePosition]; + } + + private currentBackupRule(): FleetCandidateDraft { + return this.currentSlot().candidates[this.activeBackupIndex]; + } + + /** 比较当前草稿和最近一次成功保存或加载的内容。 */ + private fleetDraftSnapshot(): string { + const ruleSnapshot = (rule: FleetRuleDraft) => ({ + shipTypes: [...rule.shipTypes], + levelEnabled: rule.levelEnabled, + minLevel: rule.minLevel, + maxLevel: rule.maxLevel, + }); + return JSON.stringify({ + name: this.presetNameInput.value, + slots: this.currentFleet().slots.map(slot => ({ + primary: slot.primary?.id ?? null, + rule: ruleSnapshot(slot), + candidates: slot.candidates.map(candidate => ({ + ship: candidate.ship?.id ?? null, + rule: ruleSnapshot(candidate), + })), + })), + }); + } + + private hasUnsavedFleetChanges(): boolean { + return this.fleetDraftSnapshot() !== this.savedFleetSnapshot; + } + + private selectedShips(): ShipLibraryShip[] { + if (this.activeSlotGroup === 'formation') { + return this.currentFleet().slots + .map(slot => slot.primary) + .filter((ship): ship is ShipLibraryShip => ship !== null); + } + return this.currentSlot().candidates + .map(candidate => candidate.ship) + .filter((ship): ship is ShipLibraryShip => ship !== null); + } + + private renderSlotRule(): void { + const main = this.currentSlot(); + const hasPrimary = main.primary !== null; + this.levelEnabled.checked = main.levelEnabled; + this.levelEnabled.disabled = !hasPrimary; + this.levelFields.hidden = !hasPrimary || !main.levelEnabled; + this.minLevel.disabled = !hasPrimary; + this.maxLevel.disabled = !hasPrimary; + this.minLevel.value = main.minLevel === null ? '' : String(main.minLevel); + this.maxLevel.value = main.maxLevel === null ? '' : String(main.maxLevel); + this.updateLevelValidity(main, this.minLevel, this.maxLevel); + + const backup = this.currentBackupRule(); + this.backupLevelEnabled.checked = backup.levelEnabled; + this.backupLevelFields.hidden = !backup.levelEnabled; + this.backupMinLevel.value = backup.minLevel === null + ? '' + : String(backup.minLevel); + this.backupMaxLevel.value = backup.maxLevel === null + ? '' + : String(backup.maxLevel); + this.updateLevelValidity( + backup, + this.backupMinLevel, + this.backupMaxLevel, + ); + } + + private applyDefaultShipType( + rule: FleetRuleDraft, + ship: ShipLibraryShip, + ): void { + if (!ALLOWED_FLEET_SHIP_TYPES.has(ship.ship_type)) { + rule.shipTypes = []; + return; + } + if ( + rule.shipTypes.length === 0 + || !rule.shipTypes.includes(ship.ship_type) + ) { + rule.shipTypes = [ship.ship_type]; + } + } + + private readLevel(input: HTMLInputElement): number | null { + if (!input.value.trim()) return null; + return Number(input.value); + } + + private updateLevelValidity( + rule: FleetRuleDraft, + minInput: HTMLInputElement, + maxInput: HTMLInputElement, + ): void { + const minInvalid = minInput.value !== '' + && (!Number.isInteger(Number(minInput.value)) + || Number(minInput.value) < 1); + const maxInvalid = maxInput.value !== '' + && (!Number.isInteger(Number(maxInput.value)) + || Number(maxInput.value) < 1); + const rangeInvalid = rule.minLevel !== null + && rule.maxLevel !== null + && rule.maxLevel < rule.minLevel; + minInput.setCustomValidity( + minInvalid ? '最小等级必须是大于或等于 1 的整数' : '', + ); + maxInput.setCustomValidity( + maxInvalid + ? '最大等级必须是大于或等于 1 的整数' + : rangeInvalid + ? '最大等级必须大于或等于最小等级' + : '', + ); + } + + private buildTeamPlan(): UserTeamPlan { + const fleet = this.currentFleet(); + const name = this.presetNameInput.value.trim(); + if (!name) throw new Error('请输入舰队预设名称'); + + const occupiedSlots = fleet.slots.filter( + slot => !this.isFleetSlotEmpty(slot), + ); + if (occupiedSlots.length === 0) { + throw new Error('当前编队至少需要一艘主选或备选舰船'); + } + const ships = occupiedSlots.map((slot, index) => ( + this.buildTeamPlanSlot(slot, index) + )); + return { name, ships }; + } + + private buildTeamPlanSlot( + slot: FleetSlotDraft, + index: number, + ): UserTeamPlanSlot { + const primary = slot.primary; + const backups = slot.candidates.filter( + (candidate): candidate is FleetCandidateDraft & { + ship: ShipLibraryShip; + } => candidate.ship !== null, + ); + const result: UserTeamPlanSlot = primary + ? this.buildTeamShipRule(primary, slot, `位置 ${index + 1} 主选`) + : {}; + if (backups.length > 0) { + result.candidates = backups.map((candidate, candidateIndex) => ( + this.buildTeamShipRule( + candidate.ship, + candidate, + `位置 ${index + 1} 备选 ${candidateIndex + 1}`, + ) + )); + } + return result; + } + + private buildTeamShipRule( + ship: ShipLibraryShip, + rule: FleetRuleDraft, + field: string, + ): UserTeamShipRule { + const invalidShipType = rule.shipTypes.find( + shipType => !ALLOWED_FLEET_SHIP_TYPES.has(shipType), + ); + if (invalidShipType) { + throw new Error(`${field} 的舰种不符合后端接口:${invalidShipType}`); + } + if (rule.levelEnabled) { + if ( + rule.minLevel !== null + && (!Number.isInteger(rule.minLevel) || rule.minLevel < 1) + ) { + throw new Error(`${field} 的最小等级不合法`); + } + if ( + rule.maxLevel !== null + && (!Number.isInteger(rule.maxLevel) || rule.maxLevel < 1) + ) { + throw new Error(`${field} 的最大等级不合法`); + } + if ( + rule.minLevel !== null + && rule.maxLevel !== null + && rule.maxLevel < rule.minLevel + ) { + throw new Error(`${field} 的最大等级不能小于最小等级`); + } + } + + const result: UserTeamShipRule = { + name: ship.name, + }; + if (ship.search_name && ship.search_name !== ship.name) { + result.search_name = ship.search_name; + } + if (rule.shipTypes.length > 0) { + result.ship_type = [...rule.shipTypes]; + } + if (rule.levelEnabled && rule.minLevel !== null) { + result.min_level = rule.minLevel; + } + if (rule.levelEnabled && rule.maxLevel !== null) { + result.max_level = rule.maxLevel; + } + return result; + } + + private async saveCurrentTeamPlan(): Promise { + const bridge = window.electronBridge; + if (!bridge?.saveUserTeamPlan) { + await showAlert('保存失败', '当前环境不支持保存编队预设'); + return; + } + try { + const plan = this.buildTeamPlan(); + let result = await bridge.saveUserTeamPlan(plan); + if (result.exists) { + const overwrite = await showConfirm( + '覆盖配置', + '存在同名配置,是否覆盖', + ); + if (!overwrite) return; + result = await bridge.saveUserTeamPlan(plan, true); + } + if (!result.success) { + throw new Error(result.error || '保存失败'); + } + this.currentFleet().name = plan.name; + this.currentFleet().file = result.file ?? null; + this.savedFleetSnapshot = this.fleetDraftSnapshot(); + await showAlert( + '保存成功', + `配置:${plan.name}已经保存`, + ); + } catch (error) { + await showAlert( + '保存失败', + error instanceof Error ? error.message : String(error), + ); + } + } + + private async loadTeamPlan(): Promise { + const bridge = window.electronBridge; + if (!bridge?.pickUserTeamPlan) { + await showAlert('加载失败', '当前环境不支持加载编队预设'); + return; + } + if (this.hasUnsavedFleetChanges()) { + const confirmed = await showConfirm( + '未保存修改', + '当前舰队编队存在未保存修改,继续加载将丢失这些修改,是否继续?', + ); + if (!confirmed) return; + } + await this.load(); + const result = await bridge.pickUserTeamPlan(); + if (result.canceled) return; + if (!result.success || !result.plan) { + await showAlert( + '加载失败', + result.error || '当前yaml格式不符合规则', + ); + return; + } + try { + const slots = result.plan.ships.map(slot => this.draftFromPlanSlot(slot)); + while (slots.length < FLEET_SLOT_COUNT) slots.push(createFleetSlotDraft()); + this.fleet = { + name: result.plan.name, + file: result.file ?? null, + slots: slots.slice(0, FLEET_SLOT_COUNT), + }; + this.presetNameInput.value = result.plan.name; + this.savedFleetSnapshot = this.fleetDraftSnapshot(); + this.activeSlotGroup = 'formation'; + this.activePosition = 0; + this.activeBackupIndex = 0; + this.renderSlots(); + this.renderBackupSlots(); + this.renderSlotRule(); + this.renderGallerySelection(); + } catch { + await showAlert('加载失败', '当前yaml格式不符合规则'); + } + } + + private draftFromPlanSlot(slot: UserTeamPlanSlot): FleetSlotDraft { + const primary = slot.name ? this.findPlanShip({ + name: slot.name, + search_name: slot.search_name, + ship_type: slot.ship_type, + min_level: slot.min_level, + max_level: slot.max_level, + }) : null; + const backups = (slot.candidates ?? []).map(candidate => ( + this.draftFromShipRule(candidate) + )); + return { + primary, + candidates: [ + ...backups, + ...Array.from( + { length: Math.max(0, DEFAULT_BACKUP_SLOT_COUNT - backups.length) }, + () => createFleetCandidateDraft(), + ), + ], + shipTypes: primary ? [...(slot.ship_type ?? [])] : [], + levelEnabled: primary + ? slot.min_level !== undefined || slot.max_level !== undefined + : false, + minLevel: primary ? slot.min_level ?? null : null, + maxLevel: primary ? slot.max_level ?? null : null, + }; + } + + private draftFromShipRule(rule: UserTeamShipRule): FleetCandidateDraft { + return { + ship: this.findPlanShip(rule), + shipTypes: [...(rule.ship_type ?? [])], + levelEnabled: rule.min_level !== undefined || rule.max_level !== undefined, + minLevel: rule.min_level ?? null, + maxLevel: rule.max_level ?? null, + }; + } + + private findPlanShip(rule: UserTeamShipRule): ShipLibraryShip { + const ship = this.ships.find(item => item.name === rule.name) + ?? this.ships.find(item => item.search_name === rule.search_name); + if (!ship) throw new Error(`舰船不存在: ${rule.name}`); + return ship; + } + + private shipTypeDisplay(ship: ShipLibraryShip): string { + const typeName = SHIP_TYPE_SHORT_NAMES[ship.ship_type] + ?? this.labels.ship_types[ship.ship_type] + ?? ship.ship_type; + return `${typeName}-${ship.ship_type.toUpperCase()}`; + } + + private showGalleryMessage(message: string): void { + const empty = document.createElement('div'); + empty.className = 'fleet-library-empty'; + empty.textContent = message; + this.gallery.replaceChildren(empty); + } + + private normalizeSearch(value: string): string { + return value + .toLocaleLowerCase('zh-CN') + .replace(/[\s·•._-]+/g, ''); + } +} diff --git a/src/view/styles/pages/plan/_fleet-planner.scss b/src/view/styles/pages/plan/_fleet-planner.scss new file mode 100644 index 0000000..33c532e --- /dev/null +++ b/src/view/styles/pages/plan/_fleet-planner.scss @@ -0,0 +1,1120 @@ +/* ═══ 舰队规划页面 ═══ */ +#page-fleet { + height: + calc( + 100vh + - var(--nav-height, 52px) + - var(--page-block-space, 32px) + ); + min-height: 0; +} + +#page-fleet.active { + display: flex; + flex-direction: column; +} + +/* ═══ 舰队规划分屏 ═══ */ +.fleet-planner-layout { + display: grid; + grid-template-columns: + clamp(540px, min(67vw, calc(100% - 268px)), 860px) + minmax(260px, 1fr); + gap: 8px; + height: 100%; + min-height: 0; +} + +.fleet-planner-layout > .card { + min-width: 0; + min-height: 0; + margin-bottom: 0; + padding: 8px; +} + +.fleet-planner-fleet, +.fleet-planner-library { + display: flex; + flex-direction: column; +} + +.fleet-planner-fleet { + overflow: hidden; + container-type: inline-size; + scrollbar-gutter: stable; + scrollbar-width: thin; +} + +.fleet-planner-library { + overflow: visible; +} + +.fleet-planner-library { + container-type: inline-size; +} + +.fleet-planner-toolbar { + gap: 6px; + overflow-x: auto; + scrollbar-width: thin; + white-space: nowrap; +} + +.fleet-preset-name-field { + display: flex; + align-items: center; + gap: 5px; + min-width: 0; + color: var(--text-secondary); + font-size: 10px; + font-weight: 600; + + span { + flex: 0 0 auto; + } + + .input { + width: 120px; + min-width: 80px; + padding: 4px 6px; + font-size: 10px; + } +} + +.fleet-preset-actions { + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + gap: 3px; +} + +.fleet-toolbar-level, +.fleet-backup-actions { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 6px; +} + +.fleet-planner-layout .btn-small { + padding: 4px 8px; + border-radius: 6px; + font-size: 10px; + line-height: 1.2; +} + +.fleet-formation-section { + display: flex; + flex: 0 0 auto; + flex-direction: column; + min-height: 0; + padding: 6px; + background: var(--bg-inset); + border: 1px solid var(--border); + border-radius: 6px; +} + +.fleet-backup-section { + flex: 1 1 0; + min-height: 216px; + margin-top: 5px; + overflow: hidden; +} + +.fleet-formation-heading { + display: flex; + flex: 0 0 auto; + align-items: center; + justify-content: flex-start; + gap: 6px; + min-height: 30px; + margin-bottom: 4px; + overflow-x: auto; + scrollbar-width: thin; + white-space: nowrap; +} + +.fleet-backup-actions { + min-width: 0; +} + +.fleet-add-backup-btn { + min-height: 28px; + padding: 4px 12px; + font-size: 11px; + font-weight: 600; + box-shadow: 0 2px 7px var(--accent-glow); +} + +.fleet-backup-append-drop { + display: inline-flex; + min-height: 24px; + align-items: center; + padding: 3px 8px; + color: var(--success); + background: color-mix(in srgb, var(--success) 10%, var(--bg-card-solid)); + border: 1px dashed color-mix(in srgb, var(--success) 72%, var(--border)); + border-radius: 6px; + font-size: 10px; + font-weight: 600; + + &[hidden] { + display: none; + } + + &.drag-over { + color: var(--text); + background: color-mix(in srgb, var(--success) 28%, var(--bg-card-solid)); + border-style: solid; + box-shadow: 0 0 10px color-mix(in srgb, var(--success) 38%, transparent); + } +} + +.fleet-backup-hint { + color: var(--text-secondary); + font-size: 10px; +} + +.fleet-planner-layout .fleet-formation-tag { + align-self: center; + margin: 0 0 4px; + color: var(--text); + font-size: 11px; + font-weight: 700; + letter-spacing: normal; + line-height: 1.2; + text-transform: none; +} + +.fleet-planner-layout .fleet-formation-heading .fleet-formation-tag { + margin-bottom: 0; +} + +.fleet-slot-rule { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 5px 10px; + margin-top: 4px; + padding: 5px 7px; + color: var(--text-secondary); + background: color-mix(in srgb, var(--bg-card-solid) 64%, transparent); + border: 1px solid var(--border); + border-radius: 5px; + font-size: 9px; + + > strong { + color: var(--text); + font-size: 10px; + } + + > label, + .fleet-level-fields label { + display: inline-flex; + align-items: center; + gap: 4px; + color: var(--text); + } + + .input { + width: 88px; + padding: 3px 5px; + font-size: 9px; + } +} + +.fleet-planner-layout .config-switch { + display: inline-flex; + align-items: center; + gap: 5px; + cursor: pointer; + + input { + position: absolute; + width: 1px; + height: 1px; + opacity: 0; + pointer-events: none; + } + + .config-switch-track { + position: relative; + flex: 0 0 auto; + width: 28px; + height: 15px; + background: var(--bg-hover); + border: 1px solid var(--border-strong); + border-radius: 999px; + transition: background 0.16s, border-color 0.16s; + + &::after { + position: absolute; + top: 2px; + left: 2px; + width: 9px; + height: 9px; + content: ''; + background: var(--text-muted); + border-radius: 50%; + transition: transform 0.16s, background 0.16s; + } + } + + input:checked + .config-switch-track { + background: var(--accent); + border-color: var(--accent); + + &::after { + background: #fff; + transform: translateX(13px); + } + } + + input:focus-visible + .config-switch-track { + box-shadow: 0 0 0 2px var(--accent-subtle); + } +} + +.fleet-level-switch { + gap: 5px !important; + font-size: 10px; +} + +.fleet-level-fields { + display: inline-flex; + align-items: center; + gap: 8px; + color: var(--text); + font-size: 10px; + + &[hidden] { + display: none; + } + + label { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: inherit; + } + + .input { + width: 60px; + padding: 4px 6px; + font-size: inherit; + } +} + +.fleet-slot-scroll, +.fleet-backup-scroll { + min-width: 0; + padding-bottom: 4px; + overflow-x: auto; + overflow-y: hidden; + scrollbar-gutter: stable; + scrollbar-width: thin; +} + +.fleet-backup-scroll { + flex: 1 1 0; + min-height: 0; + overflow: auto; +} + +.fleet-planner-fleet, +.fleet-formation-heading, +.fleet-slot-scroll, +.fleet-backup-scroll, +.fleet-filter-options-scroll, +.fleet-ship-gallery { + scrollbar-color: var(--scrollbar-thumb) transparent; + + &::-webkit-scrollbar { + width: 5px; + height: 5px; + } + + &::-webkit-scrollbar-track { + background: transparent; + } + + &::-webkit-scrollbar-thumb { + background: + color-mix( + in srgb, + var(--accent) 48%, + var(--scrollbar-thumb) + ); + background-clip: padding-box; + border: 1px solid transparent; + border-radius: var(--radius-pill); + } + + &::-webkit-scrollbar-thumb:hover { + background: color-mix(in srgb, var(--accent-hover) 70%, var(--scrollbar-thumb-hover)); + background-clip: padding-box; + } +} + +.fleet-slot-list, +.fleet-backup-slot-list { + display: grid; + grid-template-columns: repeat(6, 128px); + grid-auto-rows: 200px; + justify-content: center; + gap: 6px; + width: max-content; + min-width: 100%; + min-height: 0; +} + +.fleet-slot { + position: relative; + display: flex; + width: 128px; + height: 200px; + align-items: center; + justify-content: center; + min-width: 128px; + padding: 0; + overflow: hidden; + color: var(--text); + background: var(--bg-card-solid); + border: 0; + border-radius: var(--radius-sm); + box-shadow: inset 0 0 0 1px var(--border); + text-align: center; + cursor: pointer; + + &:hover { + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 50%, var(--border)); + } + + &.active { + box-shadow: + 0 0 0 2px rgba(255, 255, 255, 0.72), + 0 0 16px color-mix(in srgb, var(--accent-hover) 72%, transparent); + } + + &.active::after, + &.drag-over::after { + content: ''; + position: absolute; + z-index: 10; + inset: 0; + border: 4px solid var(--accent-hover); + border-radius: inherit; + pointer-events: none; + } + + &.drag-over::after { + border-color: var(--success); + background: color-mix(in srgb, var(--success) 16%, transparent); + box-shadow: inset 0 0 18px color-mix(in srgb, var(--success) 36%, transparent); + } + + &.candidate-only { + background: + linear-gradient( + 145deg, + #b65b8f, + #4f87b9 46%, + #8b63b5 + ); + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 34%, var(--border)); + } +} + +.fleet-slot-placeholder-background { + position: absolute; + z-index: 0; + top: -8%; + left: 50%; + width: 132%; + height: auto; + max-width: none; + transform: translateX(-50%); + pointer-events: none; +} + +.fleet-slot-position { + display: none; +} + +.fleet-slot-empty { + padding: 10px; + color: var(--text-secondary); + font-size: 11px; + font-weight: 600; + text-align: center; +} + +.fleet-slot.candidate-only .fleet-slot-empty { + position: relative; + z-index: 2; + padding: 8px 14px; + color: #ffd75e; + background: rgba(0, 0, 0, 0.68); + border: 1px solid rgba(255, 215, 94, 0.3); + border-radius: 7px; + box-shadow: 0 4px 14px rgba(0, 0, 0, 0.42); + backdrop-filter: blur(8px); + font-size: 12px; + letter-spacing: 0.04em; + text-shadow: 0 1px 3px #000; + user-select: none; +} + +.fleet-slot-remove { + position: absolute; + z-index: 8; + top: 6px; + right: 46px; + display: grid; + width: 18px; + height: 18px; + place-items: center; + color: #fff; + background: rgba(0, 0, 0, 0.72); + border: 1px solid rgba(255, 255, 255, 0.24); + border-radius: 50%; + font-size: 14px; + line-height: 1; + + &:hover { + color: var(--danger); + background: var(--danger-bg); + } +} + +.fleet-planner-note { + flex: 0 0 auto; + margin: 5px 0 0; + color: var(--text-secondary); + font-size: 9px; + line-height: 1.35; +} + +/* ═══ 图鉴工具栏与悬浮筛选 ═══ */ +.fleet-library-header { + position: relative; + display: grid; + grid-template-columns: minmax(88px, 1fr) minmax(230px, 340px); + gap: 5px; + align-items: center; + flex: 0 0 auto; + margin-bottom: 6px; +} + +.fleet-library-title { + display: flex; + align-items: baseline; + gap: 6px; + min-width: 0; + + h2 { + flex: 0 0 auto; + margin: 0; + font-size: 12px; + font-weight: 700; + line-height: 1.3; + } + + span { + overflow: hidden; + color: var(--text-secondary); + font-size: 10px; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +.fleet-library-search-actions { + display: flex; + width: 100%; + min-width: 0; + align-items: center; + justify-self: stretch; + gap: 5px; +} + +.fleet-library-filter-triggers { + display: flex; + flex: 1 0 50%; + justify-content: flex-end; + gap: 3px; + min-width: 138px; + + > .btn { + flex: 1 1 0; + width: 0; + min-width: 0; + white-space: nowrap; + } +} + +.fleet-planner-layout .fleet-filter-trigger { + position: relative; + display: inline-flex; + flex: 1 1 0; + align-items: center; + justify-content: center; + min-width: 0; + padding: 3px 6px; + border-radius: 5px; + font-size: 10px; + line-height: 1.2; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + &.active { + color: #fff; + background: var(--accent); + border-color: var(--accent); + } +} + +#fleet-filter-count:not(:empty) { + display: inline-grid; + min-width: 14px; + height: 14px; + margin-left: 3px; + place-items: center; + color: var(--accent); + background: #fff; + border-radius: 7px; + font-size: 8px; + font-weight: 800; +} + +.fleet-search { + display: flex; + flex: 1 1 50%; + align-items: center; + gap: 5px; + width: auto; + min-width: 0; + padding: 0 7px; + color: var(--text-secondary); + background: var(--bg-inset); + border: 1px solid var(--border); + border-radius: 6px; + + &:focus-within { + border-color: var(--accent); + box-shadow: 0 0 0 2px var(--accent-subtle); + } + + input { + width: 100%; + min-width: 0; + padding: 4px 0; + color: var(--text); + background: transparent; + border: 0; + outline: 0; + font: inherit; + font-size: 11px; + } +} + +.fleet-filter-popover { + position: absolute; + z-index: 40; + top: calc(100% + 5px); + right: 0; + width: min(620px, calc(100vw - 24px)); + max-width: calc(100vw - 24px); + max-height: + min( + 420px, + calc(100vh - var(--nav-height, 52px) - 112px) + ); + padding: 10px; + overflow-y: auto; + color: var(--text); + background: var(--bg-card-solid); + border: 1px solid var(--border-strong); + border-radius: 8px; + box-shadow: var(--shadow-elevated); + + &[hidden] { + display: none; + } +} + +.fleet-filter-popover-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 8px; + color: var(--text); + font-size: 13px; +} + +.fleet-filter-popover-heading { + display: flex; + align-items: center; + gap: 12px; +} + +.fleet-refit-filter { + gap: 5px; + font-size: 11px; + font-weight: 600; + white-space: nowrap; +} + +.fleet-filter-popover-actions { + display: flex; + align-items: center; + gap: 5px; + + #btn-confirm-fleet-filter { + min-width: 88px; + } +} + +.fleet-filter-section { + display: grid; + grid-template-columns: 64px minmax(0, 1fr); + gap: 6px; + padding: 6px 0; + border-top: 1px solid var(--border); +} + +.fleet-filter-label { + padding-top: 3px; + color: var(--text); + font-size: 11px; + font-weight: 700; +} + +.fleet-filter-options { + display: flex; + flex-wrap: wrap; + gap: 4px; +} + +.fleet-filter-options-scroll { + max-height: 94px; + overflow-y: auto; + scrollbar-width: thin; +} + +.fleet-filter-option { + padding: 3px 7px; + color: var(--text-secondary); + background: var(--bg-subtle); + border: 1px solid var(--border); + border-radius: var(--radius-pill); + font-size: 11px; + cursor: pointer; + + &:hover { + color: var(--text); + background: var(--bg-hover); + } + + &.active { + color: #fff; + background: var(--accent); + border-color: var(--accent); + } +} + +.fleet-filter-sort-section { + align-items: center; +} + +.fleet-filter-sort-controls { + display: flex; + min-width: 0; + align-items: center; + justify-content: space-between; + gap: 10px; + white-space: nowrap; + + .fleet-filter-options { + flex-wrap: nowrap; + } +} + +.fleet-sort-direction { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 4px; + color: var(--text); + font-size: 11px; + cursor: pointer; + + input { + position: absolute; + width: 1px; + height: 1px; + opacity: 0; + } + + input:checked + .fleet-sort-track::after { + transform: translateX(16px); + } +} + +.fleet-sort-track { + position: relative; + width: 34px; + height: 18px; + background: var(--accent); + border-radius: 10px; + + &::after { + content: ''; + position: absolute; + top: 2px; + left: 2px; + width: 14px; + height: 14px; + background: #fff; + border-radius: 50%; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + transition: transform 0.16s ease; + } +} + +/* ═══ 舰娘图鉴卡片 ═══ */ +.fleet-ship-gallery { + display: grid; + grid-template-columns: repeat(auto-fill, 128px); + grid-auto-rows: max-content; + justify-content: center; + gap: 6px; + align-content: start; + flex: 1 1 0; + min-height: 0; + padding: 2px 6px 10px 2px; + overflow-y: scroll; + scrollbar-gutter: stable; + scrollbar-width: thin; +} + +.fleet-ship-card { + position: relative; + display: block; + width: 128px; + height: 200px; + padding: 0; + overflow: hidden; + color: var(--text); + background: var(--bg-inset); + border: 0; + border-radius: 6px; + box-shadow: inset 0 0 0 1px var(--border); + cursor: pointer; + transition: transform 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease; + + &:hover { + z-index: 1; + box-shadow: + inset 0 0 0 1px var(--accent), + 0 6px 18px rgba(0, 0, 0, 0.3); + transform: translateY(-2px); + } + + &.in-active-fleet { + box-shadow: + inset 0 0 0 2px var(--success), + 0 0 0 2px color-mix(in srgb, var(--success) 20%, transparent); + } +} + +.fleet-ship-artwork { + position: relative; + display: block; + width: 128px; + height: 200px; + overflow: hidden; + background-color: var(--bg-card-solid); + pointer-events: none; +} + +.fleet-ship-frame { + position: absolute; + inset: 0; + width: 100%; + height: auto; + pointer-events: none; +} + +.fleet-ship-background { + position: absolute; + z-index: 0; + inset: 0; + width: 100%; + height: auto; + pointer-events: none; +} + +.fleet-ship-portrait-window { + position: absolute; + z-index: 1; + top: 1%; + right: 8%; + bottom: 1%; + left: 8%; + display: block; + overflow: hidden; + pointer-events: none; +} + +.fleet-ship-portrait { + display: block; + width: 100%; + height: auto; + object-position: center top; + pointer-events: none; +} + +.fleet-ship-frame { + z-index: 2; +} + +.fleet-ship-number { + position: absolute; + z-index: 6; + top: 6px; + left: 6px; + max-width: 72px; + padding: 2px 4px; + overflow: hidden; + color: #fff; + background: rgba(0, 0, 0, 0.74); + border: 1px solid rgba(255, 255, 255, 0.3); + border-radius: 4px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.48); + font-size: 10px; + font-weight: 800; + line-height: 1.2; + text-overflow: ellipsis; + text-shadow: 0 1px 2px #000; + white-space: nowrap; + font-family: "Cascadia Code", "Consolas", monospace; +} + +.fleet-ship-type-icon { + position: absolute; + z-index: 7; + top: 4px; + right: 4px; + width: 38px; + height: 38px; + object-fit: contain; + pointer-events: none; + filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.8)); +} + +.fleet-ship-name { + position: absolute; + z-index: 5; + right: 6px; + bottom: 6px; + left: 6px; + display: grid; + min-height: 28px; + place-items: center; + padding: 4px 6px; + overflow: hidden; + background: rgba(0, 0, 0, 0.68); + border: 1px solid rgba(255, 255, 255, 0.16); + border-radius: 5px; + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.34); + backdrop-filter: blur(7px); +} + +.fleet-ship-name-text { + display: block; + max-width: 100%; + overflow: hidden; + font-size: 11px; + font-weight: 800; + text-align: center; + text-overflow: ellipsis; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.78); + -webkit-text-stroke: 0.2px rgba(255, 255, 255, 0.35); + white-space: nowrap; +} + +.rarity-1 { + color: #fff; +} + +.rarity-2 { + color: #a0ffb3; +} + +.rarity-3 { + color: #91dcff; +} + +.rarity-4 { + color: #e1bdff; +} + +.rarity-5 { + color: #ffeb91; +} + +.rarity-6 { + color: #ff5c78; +} + +.fleet-library-empty { + grid-column: 1 / -1; + display: grid; + min-height: 120px; + place-items: center; + padding: 16px; + color: var(--text-muted); + background: var(--bg-inset); + border: 1px dashed var(--border-strong); + border-radius: var(--radius-sm); + font-size: 11px; + text-align: center; +} + +@container (max-width: 620px) { + .fleet-planner-toolbar { + flex-wrap: wrap; + row-gap: 3px; + overflow-x: hidden; + white-space: normal; + } + + .fleet-toolbar-level { + flex: 0 0 100%; + } +} + +@container (max-width: 420px) { + .fleet-library-header { + grid-template-columns: auto minmax(0, 1fr); + gap: 5px; + } + + .fleet-library-title span { + display: none; + } + + .fleet-library-search-actions { + justify-self: stretch; + } + + .fleet-library-filter-triggers { + flex-wrap: nowrap; + } + + .fleet-planner-layout .fleet-filter-trigger { + flex: 1 1 0; + padding-right: 4px; + padding-left: 4px; + } + + .fleet-filter-trigger-separator, + .fleet-filter-trigger-value { + display: none; + } +} + +@container (min-width: 421px) and (max-width: 620px) { + .fleet-library-header { + grid-template-columns: minmax(88px, 1fr) minmax(230px, 320px); + } + + .fleet-planner-layout .fleet-filter-trigger { + padding-right: 4px; + padding-left: 4px; + font-size: 10px; + } +} + +@media (max-height: 600px) { + .fleet-planner-layout > .card { + padding: 6px; + } + + .fleet-formation-heading { + min-height: 28px; + } + + .fleet-formation-section { + padding: 5px; + } + + .fleet-backup-section { + flex: 0 0 auto; + min-height: 216px; + margin-top: 4px; + } + + .fleet-planner-fleet { + overflow-x: hidden; + overflow-y: auto; + } + + .fleet-backup-scroll { + flex: 0 0 auto; + height: 206px; + } + + .fleet-formation-heading, + .fleet-planner-layout .fleet-formation-tag { + margin-bottom: 3px; + } + + .fleet-library-header { + margin-bottom: 4px; + } + + .fleet-filter-popover { + max-height: calc(100vh - var(--nav-height, 52px) - 100px); + } +} + +@media (max-width: 1120px) { + .fleet-preset-name-field .input { + width: 96px; + } +} + +@media (max-height: 800px) { + .fleet-formation-section { + padding: 4px; + } + + .fleet-planner-layout .fleet-formation-tag { + margin-bottom: 2px; + } + + .fleet-formation-heading { + margin-bottom: 2px; + } + + .fleet-backup-hint { + display: none; + } + + .fleet-slot-scroll { + padding-bottom: 0; + } + + .fleet-slot-rule { + gap: 3px 8px; + margin-top: 2px; + padding: 2px 5px; + } + + .fleet-planner-note { + display: none; + } +} diff --git a/src/view/styles/pages/plan/_index.scss b/src/view/styles/pages/plan/_index.scss index 306f7c3..61d4ab6 100644 --- a/src/view/styles/pages/plan/_index.scss +++ b/src/view/styles/pages/plan/_index.scss @@ -5,3 +5,4 @@ @use 'node-types'; @use 'layout'; @use 'node-editor'; +@use 'fleet-planner'; diff --git a/src/view/styles/styles.css b/src/view/styles/styles.css index f9d5ace..a0297c5 100644 --- a/src/view/styles/styles.css +++ b/src/view/styles/styles.css @@ -2635,6 +2635,1049 @@ input[type=checkbox]:focus-visible { line-height: 1.6; } +/* ═══ 舰队规划页面 ═══ */ +#page-fleet { + height: calc(100vh - var(--nav-height, 52px) - var(--page-block-space, 32px)); + min-height: 0; +} + +#page-fleet.active { + display: flex; + flex-direction: column; +} + +/* ═══ 舰队规划分屏 ═══ */ +.fleet-planner-layout { + display: grid; + grid-template-columns: clamp(540px, min(67vw, 100% - 268px), 860px) minmax(260px, 1fr); + gap: 8px; + height: 100%; + min-height: 0; +} + +.fleet-planner-layout > .card { + min-width: 0; + min-height: 0; + margin-bottom: 0; + padding: 8px; +} + +.fleet-planner-fleet, +.fleet-planner-library { + display: flex; + flex-direction: column; +} + +.fleet-planner-fleet { + overflow: hidden; + container-type: inline-size; + scrollbar-gutter: stable; + scrollbar-width: thin; +} + +.fleet-planner-library { + overflow: visible; +} + +.fleet-planner-library { + container-type: inline-size; +} + +.fleet-planner-toolbar { + gap: 6px; + overflow-x: auto; + scrollbar-width: thin; + white-space: nowrap; +} + +.fleet-preset-name-field { + display: flex; + align-items: center; + gap: 5px; + min-width: 0; + color: var(--text-secondary); + font-size: 10px; + font-weight: 600; +} +.fleet-preset-name-field span { + flex: 0 0 auto; +} +.fleet-preset-name-field .input { + width: 120px; + min-width: 80px; + padding: 4px 6px; + font-size: 10px; +} + +.fleet-preset-actions { + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + gap: 3px; +} + +.fleet-toolbar-level, +.fleet-backup-actions { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 6px; +} + +.fleet-planner-layout .btn-small { + padding: 4px 8px; + border-radius: 6px; + font-size: 10px; + line-height: 1.2; +} + +.fleet-formation-section { + display: flex; + flex: 0 0 auto; + flex-direction: column; + min-height: 0; + padding: 6px; + background: var(--bg-inset); + border: 1px solid var(--border); + border-radius: 6px; +} + +.fleet-backup-section { + flex: 1 1 0; + min-height: 216px; + margin-top: 5px; + overflow: hidden; +} + +.fleet-formation-heading { + display: flex; + flex: 0 0 auto; + align-items: center; + justify-content: flex-start; + gap: 6px; + min-height: 30px; + margin-bottom: 4px; + overflow-x: auto; + scrollbar-width: thin; + white-space: nowrap; +} + +.fleet-backup-actions { + min-width: 0; +} + +.fleet-add-backup-btn { + min-height: 28px; + padding: 4px 12px; + font-size: 11px; + font-weight: 600; + box-shadow: 0 2px 7px var(--accent-glow); +} + +.fleet-backup-append-drop { + display: inline-flex; + min-height: 24px; + align-items: center; + padding: 3px 8px; + color: var(--success); + background: color-mix(in srgb, var(--success) 10%, var(--bg-card-solid)); + border: 1px dashed color-mix(in srgb, var(--success) 72%, var(--border)); + border-radius: 6px; + font-size: 10px; + font-weight: 600; +} +.fleet-backup-append-drop[hidden] { + display: none; +} +.fleet-backup-append-drop.drag-over { + color: var(--text); + background: color-mix(in srgb, var(--success) 28%, var(--bg-card-solid)); + border-style: solid; + box-shadow: 0 0 10px color-mix(in srgb, var(--success) 38%, transparent); +} + +.fleet-backup-hint { + color: var(--text-secondary); + font-size: 10px; +} + +.fleet-planner-layout .fleet-formation-tag { + align-self: center; + margin: 0 0 4px; + color: var(--text); + font-size: 11px; + font-weight: 700; + letter-spacing: normal; + line-height: 1.2; + text-transform: none; +} + +.fleet-planner-layout .fleet-formation-heading .fleet-formation-tag { + margin-bottom: 0; +} + +.fleet-slot-rule { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 5px 10px; + margin-top: 4px; + padding: 5px 7px; + color: var(--text-secondary); + background: color-mix(in srgb, var(--bg-card-solid) 64%, transparent); + border: 1px solid var(--border); + border-radius: 5px; + font-size: 9px; +} +.fleet-slot-rule > strong { + color: var(--text); + font-size: 10px; +} +.fleet-slot-rule > label, +.fleet-slot-rule .fleet-level-fields label { + display: inline-flex; + align-items: center; + gap: 4px; + color: var(--text); +} +.fleet-slot-rule .input { + width: 88px; + padding: 3px 5px; + font-size: 9px; +} + +.fleet-planner-layout .config-switch { + display: inline-flex; + align-items: center; + gap: 5px; + cursor: pointer; +} +.fleet-planner-layout .config-switch input { + position: absolute; + width: 1px; + height: 1px; + opacity: 0; + pointer-events: none; +} +.fleet-planner-layout .config-switch .config-switch-track { + position: relative; + flex: 0 0 auto; + width: 28px; + height: 15px; + background: var(--bg-hover); + border: 1px solid var(--border-strong); + border-radius: 999px; + transition: background 0.16s, border-color 0.16s; +} +.fleet-planner-layout .config-switch .config-switch-track::after { + position: absolute; + top: 2px; + left: 2px; + width: 9px; + height: 9px; + content: ""; + background: var(--text-muted); + border-radius: 50%; + transition: transform 0.16s, background 0.16s; +} +.fleet-planner-layout .config-switch input:checked + .config-switch-track { + background: var(--accent); + border-color: var(--accent); +} +.fleet-planner-layout .config-switch input:checked + .config-switch-track::after { + background: #fff; + transform: translateX(13px); +} +.fleet-planner-layout .config-switch input:focus-visible + .config-switch-track { + box-shadow: 0 0 0 2px var(--accent-subtle); +} + +.fleet-level-switch { + gap: 5px !important; + font-size: 10px; +} + +.fleet-level-fields { + display: inline-flex; + align-items: center; + gap: 8px; + color: var(--text); + font-size: 10px; +} +.fleet-level-fields[hidden] { + display: none; +} +.fleet-level-fields label { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: inherit; +} +.fleet-level-fields .input { + width: 60px; + padding: 4px 6px; + font-size: inherit; +} + +.fleet-slot-scroll, +.fleet-backup-scroll { + min-width: 0; + padding-bottom: 4px; + overflow-x: auto; + overflow-y: hidden; + scrollbar-gutter: stable; + scrollbar-width: thin; +} + +.fleet-backup-scroll { + flex: 1 1 0; + min-height: 0; + overflow: auto; +} + +.fleet-planner-fleet, +.fleet-formation-heading, +.fleet-slot-scroll, +.fleet-backup-scroll, +.fleet-filter-options-scroll, +.fleet-ship-gallery { + scrollbar-color: var(--scrollbar-thumb) transparent; +} +.fleet-planner-fleet::-webkit-scrollbar, +.fleet-formation-heading::-webkit-scrollbar, +.fleet-slot-scroll::-webkit-scrollbar, +.fleet-backup-scroll::-webkit-scrollbar, +.fleet-filter-options-scroll::-webkit-scrollbar, +.fleet-ship-gallery::-webkit-scrollbar { + width: 5px; + height: 5px; +} +.fleet-planner-fleet::-webkit-scrollbar-track, +.fleet-formation-heading::-webkit-scrollbar-track, +.fleet-slot-scroll::-webkit-scrollbar-track, +.fleet-backup-scroll::-webkit-scrollbar-track, +.fleet-filter-options-scroll::-webkit-scrollbar-track, +.fleet-ship-gallery::-webkit-scrollbar-track { + background: transparent; +} +.fleet-planner-fleet::-webkit-scrollbar-thumb, +.fleet-formation-heading::-webkit-scrollbar-thumb, +.fleet-slot-scroll::-webkit-scrollbar-thumb, +.fleet-backup-scroll::-webkit-scrollbar-thumb, +.fleet-filter-options-scroll::-webkit-scrollbar-thumb, +.fleet-ship-gallery::-webkit-scrollbar-thumb { + background: color-mix(in srgb, var(--accent) 48%, var(--scrollbar-thumb)); + background-clip: padding-box; + border: 1px solid transparent; + border-radius: var(--radius-pill); +} +.fleet-planner-fleet::-webkit-scrollbar-thumb:hover, +.fleet-formation-heading::-webkit-scrollbar-thumb:hover, +.fleet-slot-scroll::-webkit-scrollbar-thumb:hover, +.fleet-backup-scroll::-webkit-scrollbar-thumb:hover, +.fleet-filter-options-scroll::-webkit-scrollbar-thumb:hover, +.fleet-ship-gallery::-webkit-scrollbar-thumb:hover { + background: color-mix(in srgb, var(--accent-hover) 70%, var(--scrollbar-thumb-hover)); + background-clip: padding-box; +} + +.fleet-slot-list, +.fleet-backup-slot-list { + display: grid; + grid-template-columns: repeat(6, 128px); + grid-auto-rows: 200px; + justify-content: center; + gap: 6px; + width: max-content; + min-width: 100%; + min-height: 0; +} + +.fleet-slot { + position: relative; + display: flex; + width: 128px; + height: 200px; + align-items: center; + justify-content: center; + min-width: 128px; + padding: 0; + overflow: hidden; + color: var(--text); + background: var(--bg-card-solid); + border: 0; + border-radius: var(--radius-sm); + box-shadow: inset 0 0 0 1px var(--border); + text-align: center; + cursor: pointer; +} +.fleet-slot:hover { + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 50%, var(--border)); +} +.fleet-slot.active { + box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.72), 0 0 16px color-mix(in srgb, var(--accent-hover) 72%, transparent); +} +.fleet-slot.active::after, .fleet-slot.drag-over::after { + content: ""; + position: absolute; + z-index: 10; + inset: 0; + border: 4px solid var(--accent-hover); + border-radius: inherit; + pointer-events: none; +} +.fleet-slot.drag-over::after { + border-color: var(--success); + background: color-mix(in srgb, var(--success) 16%, transparent); + box-shadow: inset 0 0 18px color-mix(in srgb, var(--success) 36%, transparent); +} +.fleet-slot.candidate-only { + background: linear-gradient(145deg, #b65b8f, #4f87b9 46%, #8b63b5); + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 34%, var(--border)); +} + +.fleet-slot-placeholder-background { + position: absolute; + z-index: 0; + top: -8%; + left: 50%; + width: 132%; + height: auto; + max-width: none; + transform: translateX(-50%); + pointer-events: none; +} + +.fleet-slot-position { + display: none; +} + +.fleet-slot-empty { + padding: 10px; + color: var(--text-secondary); + font-size: 11px; + font-weight: 600; + text-align: center; +} + +.fleet-slot.candidate-only .fleet-slot-empty { + position: relative; + z-index: 2; + padding: 8px 14px; + color: #ffd75e; + background: rgba(0, 0, 0, 0.68); + border: 1px solid rgba(255, 215, 94, 0.3); + border-radius: 7px; + box-shadow: 0 4px 14px rgba(0, 0, 0, 0.42); + backdrop-filter: blur(8px); + font-size: 12px; + letter-spacing: 0.04em; + text-shadow: 0 1px 3px #000; + user-select: none; +} + +.fleet-slot-remove { + position: absolute; + z-index: 8; + top: 6px; + right: 46px; + display: grid; + width: 18px; + height: 18px; + place-items: center; + color: #fff; + background: rgba(0, 0, 0, 0.72); + border: 1px solid rgba(255, 255, 255, 0.24); + border-radius: 50%; + font-size: 14px; + line-height: 1; +} +.fleet-slot-remove:hover { + color: var(--danger); + background: var(--danger-bg); +} + +.fleet-planner-note { + flex: 0 0 auto; + margin: 5px 0 0; + color: var(--text-secondary); + font-size: 9px; + line-height: 1.35; +} + +/* ═══ 图鉴工具栏与悬浮筛选 ═══ */ +.fleet-library-header { + position: relative; + display: grid; + grid-template-columns: minmax(88px, 1fr) minmax(230px, 340px); + gap: 5px; + align-items: center; + flex: 0 0 auto; + margin-bottom: 6px; +} + +.fleet-library-title { + display: flex; + align-items: baseline; + gap: 6px; + min-width: 0; +} +.fleet-library-title h2 { + flex: 0 0 auto; + margin: 0; + font-size: 12px; + font-weight: 700; + line-height: 1.3; +} +.fleet-library-title span { + overflow: hidden; + color: var(--text-secondary); + font-size: 10px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.fleet-library-search-actions { + display: flex; + width: 100%; + min-width: 0; + align-items: center; + justify-self: stretch; + gap: 5px; +} + +.fleet-library-filter-triggers { + display: flex; + flex: 1 0 50%; + justify-content: flex-end; + gap: 3px; + min-width: 138px; +} +.fleet-library-filter-triggers > .btn { + flex: 1 1 0; + width: 0; + min-width: 0; + white-space: nowrap; +} + +.fleet-planner-layout .fleet-filter-trigger { + position: relative; + display: inline-flex; + flex: 1 1 0; + align-items: center; + justify-content: center; + min-width: 0; + padding: 3px 6px; + border-radius: 5px; + font-size: 10px; + line-height: 1.2; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.fleet-planner-layout .fleet-filter-trigger.active { + color: #fff; + background: var(--accent); + border-color: var(--accent); +} + +#fleet-filter-count:not(:empty) { + display: inline-grid; + min-width: 14px; + height: 14px; + margin-left: 3px; + place-items: center; + color: var(--accent); + background: #fff; + border-radius: 7px; + font-size: 8px; + font-weight: 800; +} + +.fleet-search { + display: flex; + flex: 1 1 50%; + align-items: center; + gap: 5px; + width: auto; + min-width: 0; + padding: 0 7px; + color: var(--text-secondary); + background: var(--bg-inset); + border: 1px solid var(--border); + border-radius: 6px; +} +.fleet-search:focus-within { + border-color: var(--accent); + box-shadow: 0 0 0 2px var(--accent-subtle); +} +.fleet-search input { + width: 100%; + min-width: 0; + padding: 4px 0; + color: var(--text); + background: transparent; + border: 0; + outline: 0; + font: inherit; + font-size: 11px; +} + +.fleet-filter-popover { + position: absolute; + z-index: 40; + top: calc(100% + 5px); + right: 0; + width: min(620px, 100vw - 24px); + max-width: calc(100vw - 24px); + max-height: min(420px, 100vh - var(--nav-height, 52px) - 112px); + padding: 10px; + overflow-y: auto; + color: var(--text); + background: var(--bg-card-solid); + border: 1px solid var(--border-strong); + border-radius: 8px; + box-shadow: var(--shadow-elevated); +} +.fleet-filter-popover[hidden] { + display: none; +} + +.fleet-filter-popover-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 8px; + color: var(--text); + font-size: 13px; +} + +.fleet-filter-popover-heading { + display: flex; + align-items: center; + gap: 12px; +} + +.fleet-refit-filter { + gap: 5px; + font-size: 11px; + font-weight: 600; + white-space: nowrap; +} + +.fleet-filter-popover-actions { + display: flex; + align-items: center; + gap: 5px; +} +.fleet-filter-popover-actions #btn-confirm-fleet-filter { + min-width: 88px; +} + +.fleet-filter-section { + display: grid; + grid-template-columns: 64px minmax(0, 1fr); + gap: 6px; + padding: 6px 0; + border-top: 1px solid var(--border); +} + +.fleet-filter-label { + padding-top: 3px; + color: var(--text); + font-size: 11px; + font-weight: 700; +} + +.fleet-filter-options { + display: flex; + flex-wrap: wrap; + gap: 4px; +} + +.fleet-filter-options-scroll { + max-height: 94px; + overflow-y: auto; + scrollbar-width: thin; +} + +.fleet-filter-option { + padding: 3px 7px; + color: var(--text-secondary); + background: var(--bg-subtle); + border: 1px solid var(--border); + border-radius: var(--radius-pill); + font-size: 11px; + cursor: pointer; +} +.fleet-filter-option:hover { + color: var(--text); + background: var(--bg-hover); +} +.fleet-filter-option.active { + color: #fff; + background: var(--accent); + border-color: var(--accent); +} + +.fleet-filter-sort-section { + align-items: center; +} + +.fleet-filter-sort-controls { + display: flex; + min-width: 0; + align-items: center; + justify-content: space-between; + gap: 10px; + white-space: nowrap; +} +.fleet-filter-sort-controls .fleet-filter-options { + flex-wrap: nowrap; +} + +.fleet-sort-direction { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 4px; + color: var(--text); + font-size: 11px; + cursor: pointer; +} +.fleet-sort-direction input { + position: absolute; + width: 1px; + height: 1px; + opacity: 0; +} +.fleet-sort-direction input:checked + .fleet-sort-track::after { + transform: translateX(16px); +} + +.fleet-sort-track { + position: relative; + width: 34px; + height: 18px; + background: var(--accent); + border-radius: 10px; +} +.fleet-sort-track::after { + content: ""; + position: absolute; + top: 2px; + left: 2px; + width: 14px; + height: 14px; + background: #fff; + border-radius: 50%; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + transition: transform 0.16s ease; +} + +/* ═══ 舰娘图鉴卡片 ═══ */ +.fleet-ship-gallery { + display: grid; + grid-template-columns: repeat(auto-fill, 128px); + grid-auto-rows: max-content; + justify-content: center; + gap: 6px; + align-content: start; + flex: 1 1 0; + min-height: 0; + padding: 2px 6px 10px 2px; + overflow-y: scroll; + scrollbar-gutter: stable; + scrollbar-width: thin; +} + +.fleet-ship-card { + position: relative; + display: block; + width: 128px; + height: 200px; + padding: 0; + overflow: hidden; + color: var(--text); + background: var(--bg-inset); + border: 0; + border-radius: 6px; + box-shadow: inset 0 0 0 1px var(--border); + cursor: pointer; + transition: transform 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease; +} +.fleet-ship-card:hover { + z-index: 1; + box-shadow: inset 0 0 0 1px var(--accent), 0 6px 18px rgba(0, 0, 0, 0.3); + transform: translateY(-2px); +} +.fleet-ship-card.in-active-fleet { + box-shadow: inset 0 0 0 2px var(--success), 0 0 0 2px color-mix(in srgb, var(--success) 20%, transparent); +} + +.fleet-ship-artwork { + position: relative; + display: block; + width: 128px; + height: 200px; + overflow: hidden; + background-color: var(--bg-card-solid); + pointer-events: none; +} + +.fleet-ship-frame { + position: absolute; + inset: 0; + width: 100%; + height: auto; + pointer-events: none; +} + +.fleet-ship-background { + position: absolute; + z-index: 0; + inset: 0; + width: 100%; + height: auto; + pointer-events: none; +} + +.fleet-ship-portrait-window { + position: absolute; + z-index: 1; + top: 1%; + right: 8%; + bottom: 1%; + left: 8%; + display: block; + overflow: hidden; + pointer-events: none; +} + +.fleet-ship-portrait { + display: block; + width: 100%; + height: auto; + object-position: center top; + pointer-events: none; +} + +.fleet-ship-frame { + z-index: 2; +} + +.fleet-ship-number { + position: absolute; + z-index: 6; + top: 6px; + left: 6px; + max-width: 72px; + padding: 2px 4px; + overflow: hidden; + color: #fff; + background: rgba(0, 0, 0, 0.74); + border: 1px solid rgba(255, 255, 255, 0.3); + border-radius: 4px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.48); + font-size: 10px; + font-weight: 800; + line-height: 1.2; + text-overflow: ellipsis; + text-shadow: 0 1px 2px #000; + white-space: nowrap; + font-family: "Cascadia Code", "Consolas", monospace; +} + +.fleet-ship-type-icon { + position: absolute; + z-index: 7; + top: 4px; + right: 4px; + width: 38px; + height: 38px; + object-fit: contain; + pointer-events: none; + filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.8)); +} + +.fleet-ship-name { + position: absolute; + z-index: 5; + right: 6px; + bottom: 6px; + left: 6px; + display: grid; + min-height: 28px; + place-items: center; + padding: 4px 6px; + overflow: hidden; + background: rgba(0, 0, 0, 0.68); + border: 1px solid rgba(255, 255, 255, 0.16); + border-radius: 5px; + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.34); + backdrop-filter: blur(7px); +} + +.fleet-ship-name-text { + display: block; + max-width: 100%; + overflow: hidden; + font-size: 11px; + font-weight: 800; + text-align: center; + text-overflow: ellipsis; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.78); + -webkit-text-stroke: 0.2px rgba(255, 255, 255, 0.35); + white-space: nowrap; +} + +.rarity-1 { + color: #fff; +} + +.rarity-2 { + color: #a0ffb3; +} + +.rarity-3 { + color: #91dcff; +} + +.rarity-4 { + color: #e1bdff; +} + +.rarity-5 { + color: #ffeb91; +} + +.rarity-6 { + color: #ff5c78; +} + +.fleet-library-empty { + grid-column: 1/-1; + display: grid; + min-height: 120px; + place-items: center; + padding: 16px; + color: var(--text-muted); + background: var(--bg-inset); + border: 1px dashed var(--border-strong); + border-radius: var(--radius-sm); + font-size: 11px; + text-align: center; +} + +@container (max-width: 620px) { + .fleet-planner-toolbar { + flex-wrap: wrap; + row-gap: 3px; + overflow-x: hidden; + white-space: normal; + } + .fleet-toolbar-level { + flex: 0 0 100%; + } +} +@container (max-width: 420px) { + .fleet-library-header { + grid-template-columns: auto minmax(0, 1fr); + gap: 5px; + } + .fleet-library-title span { + display: none; + } + .fleet-library-search-actions { + justify-self: stretch; + } + .fleet-library-filter-triggers { + flex-wrap: nowrap; + } + .fleet-planner-layout .fleet-filter-trigger { + flex: 1 1 0; + padding-right: 4px; + padding-left: 4px; + } + .fleet-filter-trigger-separator, + .fleet-filter-trigger-value { + display: none; + } +} +@container (min-width: 421px) and (max-width: 620px) { + .fleet-library-header { + grid-template-columns: minmax(88px, 1fr) minmax(230px, 320px); + } + .fleet-planner-layout .fleet-filter-trigger { + padding-right: 4px; + padding-left: 4px; + font-size: 10px; + } +} +@media (max-height: 600px) { + .fleet-planner-layout > .card { + padding: 6px; + } + .fleet-formation-heading { + min-height: 28px; + } + .fleet-formation-section { + padding: 5px; + } + .fleet-backup-section { + flex: 0 0 auto; + min-height: 216px; + margin-top: 4px; + } + .fleet-planner-fleet { + overflow-x: hidden; + overflow-y: auto; + } + .fleet-backup-scroll { + flex: 0 0 auto; + height: 206px; + } + .fleet-formation-heading, + .fleet-planner-layout .fleet-formation-tag { + margin-bottom: 3px; + } + .fleet-library-header { + margin-bottom: 4px; + } + .fleet-filter-popover { + max-height: calc(100vh - var(--nav-height, 52px) - 100px); + } +} +@media (max-width: 1120px) { + .fleet-preset-name-field .input { + width: 96px; + } +} +@media (max-height: 800px) { + .fleet-formation-section { + padding: 4px; + } + .fleet-planner-layout .fleet-formation-tag { + margin-bottom: 2px; + } + .fleet-formation-heading { + margin-bottom: 2px; + } + .fleet-backup-hint { + display: none; + } + .fleet-slot-scroll { + padding-bottom: 0; + } + .fleet-slot-rule { + gap: 3px 8px; + margin-top: 2px; + padding: 2px 5px; + } + .fleet-planner-note { + display: none; + } +} /* ═══ 配置页布局 ═══ */ #page-config { overflow: auto; diff --git a/tools/ship_library/update_ship_library.py b/tools/ship_library/update_ship_library.py new file mode 100644 index 0000000..a066ef2 --- /dev/null +++ b/tools/ship_library/update_ship_library.py @@ -0,0 +1,1012 @@ +"""Build and incrementally update the local ship library. + +The updater reads the structured ship database from the Wiki Lua modules. +It reads the illustration, rarity background, frame, and type icon URLs from +the public ship index page instead of guessing resource names. +Internal table names, column names, and enum values are maintained in English. +Chinese source names are preserved only as game-facing display data. +Size and role filters are maintained as fixed groups of ship types. +Each ship is keyed by its stable in-game illustration index. +SQLite is the maintainable source for local queries and update bookkeeping. +A compact JSON manifest is generated for direct GUI consumption. +Shared rarity backgrounds, frames, and type icons are stored only once. +Asset downloads are atomic and retry failed requests. +Existing assets are skipped unless their source record changed or is missing. +Removed Wiki records are retained in SQLite and marked inactive. +The generated manifest contains active records only. +Every run records source revisions, hashes, counts, and validation results. +The final machine-readable result is printed for the Electron IPC caller. +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import re +import sqlite3 +import sys +import time +from concurrent.futures import ThreadPoolExecutor, as_completed +from dataclasses import asdict, dataclass +from datetime import UTC, datetime +from pathlib import Path +from typing import Any +from urllib.parse import urljoin + +import requests +from bs4 import BeautifulSoup + +WIKI_ROOT = 'https://www.zjsnrwiki.com' +WIKI_API = f'{WIKI_ROOT}/api.php' +SHIP_INDEX_URL = ( + f'{WIKI_ROOT}/wiki/' + '%E8%88%B0%E5%A8%98%E5%9B%BE%E9%89%B4' +) +DATABASE_MODULE = '模块:数据库/舰娘' +PATCH_MODULE = '模块:特殊数据/舰娘' +USER_AGENT = ( + 'AutoWSGR-GUI ship-library-updater/1.0 ' + '(local incremental cache)' +) + +TYPE_LABELS_ZH = { + 'ap': '补给舰', + 'av': '装甲航空母舰', + 'bb': '战列舰', + 'bbg': '导弹战列舰', + 'bbv': '航空战列舰', + 'bc': '战列巡洋舰', + 'bm': '浅水重炮舰', + 'ca': '重巡洋舰', + 'cav': '航空巡洋舰', + 'cbg': '导弹大型巡洋舰', + 'cf': '旗舰', + 'cg': '反舰导弹巡洋舰', + 'cgaa': '防空导弹巡洋舰', + 'cl': '轻巡洋舰', + 'clt': '重雷装巡洋舰', + 'cv': '航空母舰', + 'cvl': '轻型航空母舰', + 'dd': '驱逐舰', + 'ddg': '反舰导弹驱逐舰', + 'ddgaa': '防空导弹驱逐舰', + 'sc': '重炮潜艇', + 'ss': '潜水艇', + 'ssg': '导弹潜艇', +} +SIZE_LABELS_ZH = { + 'large': '大型舰', + 'medium': '中型舰', + 'small': '小型舰', +} +ROLE_LABELS_ZH = { + 'main_force': '主力舰', + 'escort': '护卫舰', +} +SIZE_TYPE_GROUPS = { + 'large': ('cv', 'av', 'bb', 'bbv', 'bc', 'cbg', 'bbg'), + 'medium': ('cvl', 'ca', 'cav', 'cl', 'clt', 'cg', 'cgaa', 'cf'), + 'small': ('dd', 'ddg', 'ddgaa', 'bm', 'ss', 'sc', 'ssg', 'ap'), +} +ROLE_TYPE_GROUPS = { + 'main_force': ( + 'cv', 'av', 'bb', 'bbv', 'bc', 'cbg', 'bbg', 'cg', 'ddg', 'ssg', + ), + 'escort': ( + 'cvl', 'ca', 'cav', 'cl', 'clt', 'cgaa', 'cf', + 'dd', 'ddgaa', 'bm', 'ss', 'sc', 'ap', + ), +} +COUNTRY_LABELS_ZH = { + 'china': '中国', + 'france': '法国', + 'germany': '德国', + 'italy': '意大利', + 'japan': '日本', + 'other': '其他', + 'soviet_union': '苏联', + 'united_kingdom': '英国', + 'united_states': '美国', +} + +SHIP_BLOCK_RE = re.compile( + r"ships\['((?:\\.|[^'])+)'\]\s*=\s*\{(.*?)\n\}", + re.DOTALL, +) +PATCH_RE = re.compile( + r"patchShips\(data,\s*'((?:\\.|[^'])+)',\s*" + r"'([^']+)',\s*(?:'((?:\\.|[^'])*)'|(-?\d+(?:\.\d+)?))\)", +) + + +@dataclass(frozen=True) +class SourceRevision: + title: str + revision_id: int + timestamp: str + sha1: str + content: str + + +@dataclass(frozen=True) +class AssetSpec: + kind: str + path: str + url: str + refresh: bool = False + + +@dataclass(frozen=True) +class ShipRecord: + ship_id: int + source_name: str + display_name_zh: str + search_name: str + variant_code: str + rarity: int + ship_type_code: str + size_class_code: str + role_class_code: str + country_code: str + source_country_zh: str + portrait_path: str + background_path: str + frame_path: str + type_icon_path: str + wiki_url: str + portrait_url: str + background_url: str + frame_url: str + type_icon_url: str + source_hash: str + + +def utc_now() -> str: + return datetime.now(UTC).replace(microsecond=0).isoformat() + + +def request_headers() -> dict[str, str]: + return { + 'User-Agent': USER_AGENT, + 'Referer': f'{WIKI_ROOT}/', + 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.5', + } + + +def fetch_revision(session: requests.Session, title: str) -> SourceRevision: + response = session.get( + WIKI_API, + params={ + 'action': 'query', + 'prop': 'revisions', + 'rvprop': 'ids|timestamp|sha1|content', + 'rvslots': 'main', + 'titles': title, + 'format': 'json', + 'formatversion': '2', + }, + timeout=60, + ) + response.raise_for_status() + page = response.json()['query']['pages'][0] + if page.get('missing'): + raise RuntimeError(f'Wiki source page is missing: {title}') + revision = page['revisions'][0] + return SourceRevision( + title=title, + revision_id=int(revision['revid']), + timestamp=str(revision['timestamp']), + sha1=str(revision['sha1']), + content=str(revision['slots']['main']['content']), + ) + + +def lua_unescape(value: str) -> str: + return value.replace("\\'", "'").replace('\\\\', '\\') + + +def read_lua_field(body: str, key: str) -> str | None: + match = re.search( + rf"\b{re.escape(key)}\s*=\s*(?:'((?:\\.|[^'])*)'|" + r'(-?\d+(?:\.\d+)?))', + body, + ) + if not match: + return None + return lua_unescape(match.group(1)) if match.group(1) is not None else match.group(2) + + +def parse_ship_module( + database_source: str, + patch_source: str, +) -> dict[int, dict[str, Any]]: + by_name: dict[str, dict[str, Any]] = {} + for match in SHIP_BLOCK_RE.finditer(database_source): + name = lua_unescape(match.group(1)) + body = match.group(2) + index = read_lua_field(body, 'index') + rarity = read_lua_field(body, 'rarity') + ship_type = read_lua_field(body, 'type') + country = read_lua_field(body, 'country') + size = read_lua_field(body, 'size') + if None in (index, rarity, ship_type, country, size): + raise ValueError(f'Incomplete Wiki ship record: {name}') + by_name[name] = { + 'index': int(float(index)), + 'rarity': int(float(rarity)), + 'type': ship_type, + 'country': country, + 'size': size, + } + + # The patch module is part of the Wiki data contract and overrides fields. + for match in PATCH_RE.finditer(patch_source): + name = lua_unescape(match.group(1)) + attribute = match.group(2) + value = ( + lua_unescape(match.group(3)) + if match.group(3) is not None + else match.group(4) + ) + if name in by_name and attribute in by_name[name]: + by_name[name][attribute] = value + + by_id = {int(data['index']): {'name': name, **data} for name, data in by_name.items()} + if len(by_id) != len(by_name): + raise ValueError('Duplicate ship indexes found in Wiki module') + return by_id + + +def country_group(source_country: str) -> str: + normalized = re.sub(r'\s+', '', source_country) + direct = { + '中国': 'china', + '法国': 'france', + '德国': 'germany', + '意大利': 'italy', + '日本': 'japan', + '英国': 'united_kingdom', + '美国': 'united_states', + } + if normalized in direct: + return direct[normalized] + if normalized in {'苏联', '沙俄'}: + return 'soviet_union' + return 'other' + + +def ship_type_groups(ship_type_code: str) -> tuple[str, str]: + size_matches = [ + group + for group, ship_types in SIZE_TYPE_GROUPS.items() + if ship_type_code in ship_types + ] + role_matches = [ + group + for group, ship_types in ROLE_TYPE_GROUPS.items() + if ship_type_code in ship_types + ] + if len(size_matches) != 1 or len(role_matches) != 1: + raise ValueError( + f'Unsupported or duplicate ship type group: {ship_type_code}', + ) + return size_matches[0], role_matches[0] + + +def variant_code(ship_id: int, source_name: str) -> str: + if source_name.endswith('·改') or 1000 <= ship_id < 2000: + return 'refit' + if ship_id >= 8000: + return 'special' + return 'normal' + + +def search_name(source_name: str) -> str: + return source_name[:-2] if source_name.endswith('·改') else source_name + + +def card_image_url(card: Any, pattern: str) -> str: + for image in card.find_all('img'): + source = str(image.get('src', '')) + if re.search(pattern, source): + return urljoin(WIKI_ROOT, source) + raise ValueError(f'Card asset not found: {pattern}') + + +def build_ship_records( + index_html: str, + module_ships: dict[int, dict[str, Any]], +) -> list[ShipRecord]: + soup = BeautifulSoup(index_html, 'html.parser') + records: list[ShipRecord] = [] + portrait_pattern = re.compile(r'/M_NORMAL_WEBP/M_NORMAL_(\d+)\.webp$') + + for portrait in soup.find_all('img', src=portrait_pattern): + portrait_url = urljoin(WIKI_ROOT, str(portrait['src'])) + ship_id = int(portrait_pattern.search(str(portrait['src'])).group(1)) + source = module_ships.get(ship_id) + if not source: + raise ValueError(f'Index ship {ship_id} is missing from Wiki module') + card = portrait.find_parent( + 'div', + style=lambda value: value and 'position: relative' in value, + ) + if card is None: + raise ValueError(f'Cannot locate ship card for index {ship_id}') + + background_url = card_image_url(card, r'/\d+star_bg\.webp$') + frame_url = card_image_url(card, r'/\d+star_box\.webp$') + type_icons = [] + for image in card.find_all('img'): + image_url = urljoin(WIKI_ROOT, str(image.get('src', ''))) + file_name = image_url.rsplit('/', maxsplit=1)[-1] + type_code = file_name.removesuffix('.webp').lower() + if type_code in TYPE_LABELS_ZH: + type_icons.append((type_code, image_url)) + if len(type_icons) != 1: + raise ValueError( + f'Expected one type icon for ship {ship_id}, got {type_icons}', + ) + ship_type_code, type_icon_url = type_icons[0] + + anchor = portrait.find_parent('a') + wiki_url = urljoin(WIKI_ROOT, str(anchor.get('href', ''))) if anchor else '' + size_code, role_code = ship_type_groups(ship_type_code) + source_name = str(source['name']) + rarity = int(source['rarity']) + data = { + 'ship_id': ship_id, + 'source_name': source_name, + 'display_name_zh': source_name, + 'search_name': search_name(source_name), + 'variant_code': variant_code(ship_id, source_name), + 'rarity': rarity, + 'ship_type_code': ship_type_code, + 'size_class_code': size_code, + 'role_class_code': role_code, + 'country_code': country_group(str(source['country'])), + 'source_country_zh': re.sub(r'\s+', '', str(source['country'])), + 'portrait_path': f'assets/portraits/{ship_id}.webp', + 'background_path': f'assets/backgrounds/rarity-{rarity}.webp', + 'frame_path': f'assets/frames/rarity-{rarity}.webp', + 'type_icon_path': f'assets/type-icons/{ship_type_code}.webp', + 'wiki_url': wiki_url, + 'portrait_url': portrait_url, + 'background_url': background_url, + 'frame_url': frame_url, + 'type_icon_url': type_icon_url, + } + source_hash = hashlib.sha256( + json.dumps(data, ensure_ascii=False, sort_keys=True).encode('utf-8'), + ).hexdigest() + records.append(ShipRecord(**data, source_hash=source_hash)) + + records.sort(key=lambda item: item.ship_id) + if len({item.ship_id for item in records}) != len(records): + raise ValueError('Duplicate ship indexes found on Wiki index page') + return records + + +def open_database(path: Path) -> sqlite3.Connection: + path.parent.mkdir(parents=True, exist_ok=True) + connection = sqlite3.connect(path) + connection.row_factory = sqlite3.Row + connection.executescript( + """ + PRAGMA journal_mode = WAL; + PRAGMA foreign_keys = ON; + + CREATE TABLE IF NOT EXISTS ships ( + ship_id INTEGER PRIMARY KEY, + source_name TEXT NOT NULL, + display_name_zh TEXT NOT NULL, + search_name TEXT NOT NULL, + variant_code TEXT NOT NULL, + rarity INTEGER NOT NULL, + ship_type_code TEXT NOT NULL, + size_class_code TEXT NOT NULL, + role_class_code TEXT NOT NULL, + country_code TEXT NOT NULL, + source_country_zh TEXT NOT NULL, + portrait_path TEXT NOT NULL, + background_path TEXT NOT NULL, + frame_path TEXT NOT NULL, + type_icon_path TEXT NOT NULL, + wiki_url TEXT NOT NULL, + portrait_url TEXT NOT NULL, + background_url TEXT NOT NULL, + frame_url TEXT NOT NULL, + type_icon_url TEXT NOT NULL, + source_hash TEXT NOT NULL, + source_revision INTEGER NOT NULL, + is_active INTEGER NOT NULL DEFAULT 1, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_ships_display_name + ON ships(display_name_zh); + CREATE INDEX IF NOT EXISTS idx_ships_filters + ON ships(ship_type_code, country_code, size_class_code, role_class_code); + + CREATE TABLE IF NOT EXISTS ship_type_groups ( + ship_type_code TEXT NOT NULL, + group_kind TEXT NOT NULL, + group_code TEXT NOT NULL, + PRIMARY KEY (ship_type_code, group_kind) + ); + + CREATE INDEX IF NOT EXISTS idx_ship_type_groups_lookup + ON ship_type_groups(group_kind, group_code); + + CREATE TABLE IF NOT EXISTS assets ( + path TEXT PRIMARY KEY, + kind TEXT NOT NULL, + url TEXT NOT NULL, + etag TEXT, + last_modified TEXT, + sha256 TEXT NOT NULL, + byte_size INTEGER NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS sources ( + title TEXT PRIMARY KEY, + revision_id INTEGER NOT NULL, + timestamp TEXT NOT NULL, + sha1 TEXT NOT NULL, + checked_at TEXT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS sync_runs ( + run_id INTEGER PRIMARY KEY AUTOINCREMENT, + started_at TEXT NOT NULL, + completed_at TEXT NOT NULL, + added_count INTEGER NOT NULL, + updated_count INTEGER NOT NULL, + removed_count INTEGER NOT NULL, + downloaded_count INTEGER NOT NULL, + failed_count INTEGER NOT NULL + ); + """, + ) + return connection + + +def asset_specs( + records: list[ShipRecord], + changed_ids: set[int], +) -> list[AssetSpec]: + unique: dict[str, AssetSpec] = {} + for record in records: + values = ( + AssetSpec( + 'portrait', + record.portrait_path, + record.portrait_url, + record.ship_id in changed_ids, + ), + AssetSpec('background', record.background_path, record.background_url), + AssetSpec('frame', record.frame_path, record.frame_url), + AssetSpec('type_icon', record.type_icon_path, record.type_icon_url), + ) + for spec in values: + current = unique.get(spec.path) + unique[spec.path] = ( + spec + if current is None + else AssetSpec( + spec.kind, + spec.path, + spec.url, + current.refresh or spec.refresh, + ) + ) + return sorted(unique.values(), key=lambda item: item.path) + + +def file_sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open('rb') as handle: + for chunk in iter(lambda: handle.read(1024 * 1024), b''): + digest.update(chunk) + return digest.hexdigest() + + +def download_asset( + output: Path, + spec: AssetSpec, + previous: dict[str, Any] | None, + force_assets: bool, +) -> tuple[AssetSpec, dict[str, Any] | None, str | None]: + target = output / spec.path + if ( + target.exists() + and target.stat().st_size > 0 + and not force_assets + and not spec.refresh + and previous + and previous.get('url') == spec.url + ): + return spec, None, None + + headers = request_headers() + if target.exists() and previous and previous.get('url') == spec.url: + if previous.get('etag'): + headers['If-None-Match'] = str(previous['etag']) + if previous.get('last_modified'): + headers['If-Modified-Since'] = str(previous['last_modified']) + + error: str | None = None + for attempt in range(3): + try: + response = requests.get( + spec.url, + headers=headers, + timeout=45, + ) + if response.status_code == 304 and target.exists(): + return spec, None, None + response.raise_for_status() + content_type = response.headers.get('content-type', '') + is_webp = ( + target.suffix.lower() == '.webp' + and response.content.startswith(b'RIFF') + and response.content[8:12] == b'WEBP' + ) + if len(response.content) < 100 or ( + 'image/' not in content_type + and not is_webp + ): + raise ValueError( + f'Unexpected asset response: {content_type}, ' + f'{len(response.content)} bytes', + ) + target.parent.mkdir(parents=True, exist_ok=True) + temporary = target.with_suffix(f'{target.suffix}.tmp') + temporary.write_bytes(response.content) + os.replace(temporary, target) + metadata = { + 'path': spec.path, + 'kind': spec.kind, + 'url': spec.url, + 'etag': response.headers.get('etag'), + 'last_modified': response.headers.get('last-modified'), + 'sha256': hashlib.sha256(response.content).hexdigest(), + 'byte_size': len(response.content), + 'updated_at': utc_now(), + } + return spec, metadata, None + except Exception as exc: # Retry transient CDN or network failures. + error = str(exc) + time.sleep(0.6 * (attempt + 1)) + return spec, None, error + + +def download_assets( + connection: sqlite3.Connection, + output: Path, + specs: list[AssetSpec], + workers: int, + force_assets: bool, +) -> tuple[list[dict[str, Any]], list[str], int]: + previous = { + str(row['path']): dict(row) + for row in connection.execute('SELECT * FROM assets') + } + updates: list[dict[str, Any]] = [] + failures: list[str] = [] + downloaded = 0 + with ThreadPoolExecutor(max_workers=workers) as executor: + futures = { + executor.submit( + download_asset, + output, + spec, + previous.get(spec.path), + force_assets, + ): spec + for spec in specs + } + completed = 0 + for future in as_completed(futures): + spec, metadata, error = future.result() + completed += 1 + if metadata: + updates.append(metadata) + downloaded += 1 + if error: + failures.append(f'{spec.path}: {error}') + if completed % 25 == 0 or completed == len(specs): + print( + f'PROGRESS assets {completed}/{len(specs)} ' + f'downloaded={downloaded} failed={len(failures)}', + flush=True, + ) + return updates, failures, downloaded + + +def write_json_atomic(path: Path, value: Any) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_suffix(f'{path.suffix}.tmp') + temporary.write_text( + json.dumps(value, ensure_ascii=False, indent=2) + '\n', + encoding='utf-8', + ) + os.replace(temporary, path) + + +def labels_manifest() -> dict[str, Any]: + return { + 'locale': 'zh-CN', + 'ship_types': TYPE_LABELS_ZH, + 'size_classes': SIZE_LABELS_ZH, + 'role_classes': ROLE_LABELS_ZH, + 'countries': COUNTRY_LABELS_ZH, + 'variants': { + 'normal': '普通', + 'refit': '改造', + 'special': '特殊', + }, + } + + +def type_groups_manifest() -> dict[str, dict[str, list[str]]]: + return { + 'size_classes': { + group: list(ship_types) + for group, ship_types in SIZE_TYPE_GROUPS.items() + }, + 'role_classes': { + group: list(ship_types) + for group, ship_types in ROLE_TYPE_GROUPS.items() + }, + } + + +def update_database( + connection: sqlite3.Connection, + records: list[ShipRecord], + revisions: list[SourceRevision], + asset_updates: list[dict[str, Any]], + started_at: str, + downloaded: int, + failed_count: int, +) -> tuple[int, int, int]: + now = utc_now() + old_rows = { + int(row['ship_id']): dict(row) + for row in connection.execute( + 'SELECT ship_id, source_hash, is_active FROM ships', + ) + } + active_ids = {record.ship_id for record in records} + added = sum(record.ship_id not in old_rows for record in records) + updated = sum( + record.ship_id in old_rows + and old_rows[record.ship_id]['source_hash'] != record.source_hash + for record in records + ) + removed = sum( + bool(row['is_active']) and ship_id not in active_ids + for ship_id, row in old_rows.items() + ) + + with connection: + connection.execute('UPDATE ships SET is_active = 0') + connection.execute('DELETE FROM ship_type_groups') + connection.executemany( + """ + INSERT INTO ship_type_groups ( + ship_type_code, group_kind, group_code + ) VALUES (?, 'size_class', ?) + """, + [ + (ship_type, group) + for group, ship_types in SIZE_TYPE_GROUPS.items() + for ship_type in ship_types + ], + ) + connection.executemany( + """ + INSERT INTO ship_type_groups ( + ship_type_code, group_kind, group_code + ) VALUES (?, 'role_class', ?) + """, + [ + (ship_type, group) + for group, ship_types in ROLE_TYPE_GROUPS.items() + for ship_type in ship_types + ], + ) + for record in records: + values = asdict(record) + connection.execute( + """ + INSERT INTO ships ( + ship_id, source_name, display_name_zh, search_name, + variant_code, rarity, ship_type_code, size_class_code, + role_class_code, country_code, source_country_zh, + portrait_path, background_path, frame_path, type_icon_path, + wiki_url, portrait_url, background_url, frame_url, + type_icon_url, source_hash, source_revision, is_active, + updated_at + ) VALUES ( + :ship_id, :source_name, :display_name_zh, :search_name, + :variant_code, :rarity, :ship_type_code, :size_class_code, + :role_class_code, :country_code, :source_country_zh, + :portrait_path, :background_path, :frame_path, + :type_icon_path, :wiki_url, :portrait_url, + :background_url, :frame_url, :type_icon_url, :source_hash, + :source_revision, 1, :updated_at + ) + ON CONFLICT(ship_id) DO UPDATE SET + source_name = excluded.source_name, + display_name_zh = excluded.display_name_zh, + search_name = excluded.search_name, + variant_code = excluded.variant_code, + rarity = excluded.rarity, + ship_type_code = excluded.ship_type_code, + size_class_code = excluded.size_class_code, + role_class_code = excluded.role_class_code, + country_code = excluded.country_code, + source_country_zh = excluded.source_country_zh, + portrait_path = excluded.portrait_path, + background_path = excluded.background_path, + frame_path = excluded.frame_path, + type_icon_path = excluded.type_icon_path, + wiki_url = excluded.wiki_url, + portrait_url = excluded.portrait_url, + background_url = excluded.background_url, + frame_url = excluded.frame_url, + type_icon_url = excluded.type_icon_url, + source_hash = excluded.source_hash, + source_revision = excluded.source_revision, + is_active = 1, + updated_at = excluded.updated_at + """, + { + **values, + 'source_revision': revisions[0].revision_id, + 'updated_at': now, + }, + ) + for asset in asset_updates: + connection.execute( + """ + INSERT INTO assets ( + path, kind, url, etag, last_modified, sha256, + byte_size, updated_at + ) VALUES ( + :path, :kind, :url, :etag, :last_modified, :sha256, + :byte_size, :updated_at + ) + ON CONFLICT(path) DO UPDATE SET + kind = excluded.kind, + url = excluded.url, + etag = excluded.etag, + last_modified = excluded.last_modified, + sha256 = excluded.sha256, + byte_size = excluded.byte_size, + updated_at = excluded.updated_at + """, + asset, + ) + for revision in revisions: + connection.execute( + """ + INSERT INTO sources ( + title, revision_id, timestamp, sha1, checked_at + ) VALUES (?, ?, ?, ?, ?) + ON CONFLICT(title) DO UPDATE SET + revision_id = excluded.revision_id, + timestamp = excluded.timestamp, + sha1 = excluded.sha1, + checked_at = excluded.checked_at + """, + ( + revision.title, + revision.revision_id, + revision.timestamp, + revision.sha1, + now, + ), + ) + connection.execute( + """ + INSERT INTO sync_runs ( + started_at, completed_at, added_count, updated_count, + removed_count, downloaded_count, failed_count + ) VALUES (?, ?, ?, ?, ?, ?, ?) + """, + ( + started_at, + now, + added, + updated, + removed, + downloaded, + failed_count, + ), + ) + return added, updated, removed + + +def manifest_ship(record: ShipRecord) -> dict[str, Any]: + return { + 'id': record.ship_id, + 'name': record.display_name_zh, + 'search_name': record.search_name, + 'variant': record.variant_code, + 'rarity': record.rarity, + 'ship_type': record.ship_type_code, + 'size_class': record.size_class_code, + 'role_class': record.role_class_code, + 'country': record.country_code, + 'portrait': record.portrait_path, + 'background': record.background_path, + 'frame': record.frame_path, + 'type_icon': record.type_icon_path, + 'wiki_url': record.wiki_url, + } + + +def validate_assets(output: Path, specs: list[AssetSpec]) -> list[str]: + return [ + spec.path + for spec in specs + if not (output / spec.path).is_file() + or (output / spec.path).stat().st_size == 0 + ] + + +def run(args: argparse.Namespace) -> dict[str, Any]: + started_at = utc_now() + output = Path(args.output).resolve() + output.mkdir(parents=True, exist_ok=True) + session = requests.Session() + session.headers.update(request_headers()) + + print('PROGRESS sources fetching Wiki data', flush=True) + database_revision = fetch_revision(session, DATABASE_MODULE) + patch_revision = fetch_revision(session, PATCH_MODULE) + index_response = session.get(SHIP_INDEX_URL, timeout=60) + index_response.raise_for_status() + index_response.encoding = 'utf-8' + + module_ships = parse_ship_module( + database_revision.content, + patch_revision.content, + ) + records = build_ship_records(index_response.text, module_ships) + if not records: + raise RuntimeError('Wiki index returned no ship records') + print(f'PROGRESS records parsed={len(records)}', flush=True) + + database_path = output / 'database' / 'ships.sqlite3' + connection = open_database(database_path) + try: + previous_hashes = { + int(row['ship_id']): str(row['source_hash']) + for row in connection.execute('SELECT ship_id, source_hash FROM ships') + } + changed_ids = { + record.ship_id + for record in records + if previous_hashes.get(record.ship_id) != record.source_hash + } + specs = asset_specs(records, changed_ids) + asset_updates, download_failures, downloaded = download_assets( + connection, + output, + specs, + max(1, min(16, int(args.workers))), + bool(args.force_assets), + ) + missing_assets = validate_assets(output, specs) + failed_paths = sorted({ + *missing_assets, + *(failure.partition(': ')[0] for failure in download_failures), + }) + failure_details = sorted(set( + download_failures + + [ + path + for path in missing_assets + if not any( + failure.startswith(f'{path}: ') + for failure in download_failures + ) + ] + )) + added, updated, removed = update_database( + connection, + records, + [database_revision, patch_revision], + asset_updates, + started_at, + downloaded, + len(failed_paths), + ) + finally: + connection.close() + + generated_at = utc_now() + labels = labels_manifest() + manifest = { + 'schema_version': 2, + 'generated_at': generated_at, + 'source': { + 'wiki': WIKI_ROOT, + 'index_url': SHIP_INDEX_URL, + 'database_revision': database_revision.revision_id, + 'patch_revision': patch_revision.revision_id, + }, + 'counts': { + 'ships': len(records), + 'assets': len(specs), + 'missing_assets': len(missing_assets), + }, + 'labels': labels, + 'type_groups': type_groups_manifest(), + 'ships': [manifest_ship(record) for record in records], + } + write_json_atomic(output / 'manifest.json', manifest) + write_json_atomic(output / 'labels.zh-CN.json', labels) + + return { + 'success': not failed_paths, + 'output': str(output), + 'generated_at': generated_at, + 'ship_count': len(records), + 'asset_count': len(specs), + 'added': added, + 'updated': updated, + 'removed': removed, + 'downloaded': downloaded, + 'failed': len(failed_paths), + 'failures': failure_details[:20], + } + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description='Incrementally update the AutoWSGR GUI ship library.', + ) + parser.add_argument( + '--output', + required=True, + help='Ship library output directory.', + ) + parser.add_argument( + '--workers', + type=int, + default=8, + help='Concurrent asset downloads (default: 8).', + ) + parser.add_argument( + '--force-assets', + action='store_true', + help='Conditionally verify every existing asset.', + ) + return parser.parse_args() + + +def main() -> int: + try: + result = run(parse_args()) + except Exception as exc: + result = { + 'success': False, + 'error': f'{type(exc).__name__}: {exc}', + } + print( + 'RESULT_JSON=' + json.dumps(result, ensure_ascii=False), + flush=True, + ) + return 0 if result.get('success') else 1 + + +if __name__ == '__main__': + sys.exit(main())