ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Pokemon Showdown 的 `@smogon/sets` 数据包:来源、结构与导入原理全解析

Pokemon Showdown 的 `@smogon/sets` 数据包:来源、结构与导入原理全解析 后端【免费下载链接】pokemon-showdownPokémon battle simulator.项目地址https://gitcode.com/gh_mirrors/po/pokemon-showdown点击查看免费下载smogon/sets是 Pokémon Showdown 仓库中独立维护、对外发布的精灵配置sets数据包。它聚合了两类数据源——来自 Smogon.com 分析文章analyses的dex配置以及基于官方天梯对局使用统计usage stats生成的stats配置并通过统一的 TypeScript 类型与加载接口向 Node.js 与浏览器环境提供查询能力。读完本文你将完整掌握该数据包的数据来源、目录结构、TypeScript 类型定义、forGen/forFormat加载 API以及其背后的导入工具tools/set-import/importer.ts如何抓取、清洗、校验并打包这些数据。一、数据包定位一个可独立发布的精灵配置数据集smogon/sets位于仓库的 tools/set-import/sets 目录是一个以 npm 包形式发布的成品数据产物。其README明确指出该包包含从以下两个来源导入或生成的配置数据数据源说明版权与使用限制dex来自 Smogon.com 分析文章analyses的配置数据版权归 Smogon.com 及其贡献者所有若要在应用中使用该数据源必须事先获得 Smogon.com 的许可stats基于官方 Pokémon Showdown 服务器天梯对局的使用统计usage stats生成与类型定义、加载逻辑一同以 MIT 许可证分发许可证方面包的类型定义types、加载逻辑loading logic以及stats数据源均遵循 MIT 许可证见 tools/set-import/sets/LICENSE 与仓库根目录 LICENSE其余数据源可能受额外限制使用前应与原始作者协商。这也解释了为何生成的package.json中license字段被标记为UNLICENSED——代码与类型声明是 MIT但并非所有数据源都落入 MIT 范畴。二、数据包目录与产物结构sets/目录在发布状态下包含以下核心文件index.d.ts对外暴露的 TypeScript 类型声明是整个包的“类型契约”index.js加载逻辑入口由导入脚本自动生成package.jsonnpm 包元信息同样由导入脚本生成gen1.json…gen9.json按世代聚合的完整数据各格式专属 JSON如gen7balancedhackmons.jsonREADME.md与LICENSE数据来源说明与许可证。值得注意的是当前仓库中sets/目录仅保留了LICENSE、README.md与index.d.ts三个源文件而gen*.json、package.json、index.js均是由导入工具运行后生成的构建产物不随仓库源码提交。下面结合源码逐层拆解这三类“非产物”文件的角色。三、类型契约index.d.ts逐项解析工具入口 定义了数据包的完整类型体系理解它是消费该数据包的第一步export declare type StatName hp | atk | def | spa | spd | spe; export type StatsTableT number {[stat in StatName]: T};StatName定义六项基础能力值HP、物攻、物防、特攻、特防、速度StatsTableT是这六项的映射表泛型默认值为number既可用于数值型 EV/IV也可用于字符串类型。精灵配置本体PokemonSetT string是数据包中最核心的结构export interface PokemonSetT string { name: string; species: T; item: T; ability: T; moves: T[]; nature: T; teraType: string; gender: string; evs: StatsTable; ivs: StatsTable; level: number; shiny?: boolean; happiness?: number; pokeball?: T; hpType?: string; }必填字段name配置名、species宝可梦、item携带道具、ability特性、moves招式列表、nature性格、teraType太晶属性、gender性别、evs/ivs努力值与个体值、level等级可选字段shiny闪光、happiness亲密度、pokeball精灵球、hpType觉醒力量属性用于纠正 HP 类型与个体值的匹配。DeepPartialT是一个递归可选类型允许任意深度的字段缺省export declare type DeepPartialT { [P in keyof T]?: T[P] extends Arrayinfer I ? ArrayDeepPartialI : DeepPartialT[P]; };数组元素会被递归展开为DeepPartial这正是stats数据源生成结果的特点——不完整、只有顶层常用字段详见下文“usage-based sets”一节。顶层数据结构以“世代 → 格式 → 数据源 → 宝可梦 → 配置名 → 配置”五层嵌套组织export interface GenerationData { [formatid: string]: FormatData; } export interface FormatData { [source: string]: { [speciesid: string]: { [name: string]: DeepPartialPokemonSet; }; }; }GenerationData一个世代的完整数据键为格式 ID如gen7balancedhackmonsFormatData单个格式的数据键为数据源dex/stats等第三层键为宝可梦 ID如landorus-therian第四层键为配置名称如Choice Scarf、Showdown Usage最终落到一份DeepPartialPokemonSet。世代与加载 API 的类型约束export type GenerationNum 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; export type Generation {num: GenerationNum}; export declare function forGen(gen: Generation | GenerationNum): PromiseGenerationData | undefined; export declare function forFormat(format: string): PromiseFormatData | undefined;forGen接受数字世代或{num: 1..9}对象返回该世代全部格式的数据forFormat接受格式字符串返回单个格式的数据若格式不存在则返回undefined。四、加载逻辑index.js的生成机制与双环境兼容index.js并非手写源码而是由 tools/set-import/index.js 中的打包脚本动态生成的。生成逻辑的核心是一个巧妙的“同构”设计——同一份代码在 Node.js 与浏览器两种环境下都能工作if (typeof window undefined) { JSON { gen1: load(./gen1.json), gen7balancedhackmons: load(./gen7balancedhackmons.json), // ... }; } else { JSON { gen1: import(./gen1.json), gen7balancedhackmons: import(./gen7balancedhackmons.json), // ... }; }在 Node.js 中通过require同步加载 JSONload函数内部包装为Promise.resolve(require(path))保证异步 API 的一致性在浏览器window存在中改用动态import()让打包工具可以按需拆包forGen接收数字世代或带num属性的对象拼接出gen${n}键forFormat直接用格式 ID 作为键索引。每个世代还会单独生成一份按格式拆分的 JSON 文件如gen9ou.json供forFormat按需读取避免加载整个世代的全量数据。五、数据导入流水线从抓取到校验再到落盘数据包的内容由 tools/set-import/importer.ts 生成。整条流水线可以拆成四个阶段。5.1 阶段一构建受支持的“世代 × 分级”矩阵导入器在启动时遍历TIERS集合importer.ts#L41-L50包含ubers、ou、uu、ru、nu、pu、zu、lc、cap、nationaldex、doublesou、各代 VGC 系列、anythinggoes、balancedhackmons、monotype、letsgoou等分级再与世代 19 交叉组合成格式 ID如gen7balancedhackmons通过Dex.formats.get()确认格式存在后为每个格式实例化一个TeamValidator用于后续合法性校验。5.2 阶段二dex数据源——抓取 Smogon 分析文章importSmogonSets逐宝可梦调用smogon.Analyses.url()构造分析文章 URL用带重试与限速的 HTTP 客户端抓取并解析。对每个 moveset 做以下转换movesetToPokemonSetlevel根据格式规则表getLevel修正等级默认 100 时不写入moves取moveslots中每个槽位的招式名若带类型标注则拼成招式 类型形式用于觉醒力量ability通过fixedAbility处理——二代及以前不写特性Mega/Primal/Ultra 形态固定使用其第一特性其余形态保留分析文章给出的特性itemNo Item映射为undefinedivs/evs通过toStatsTable转换默认值IV 为 31、EV 为 0被省略以精简 JSON。Mega 等“仅战斗形态”battleOnly还会被拆出独立条目浅拷贝配置并改写特性后以配置名 - 基础形态名的形式追加到对应基础宝可梦名下importer.ts#L199-L211避免形态与基础形态的配置互相覆盖。5.3 阶段三stats数据源——基于天梯使用统计生成importUsageBasedSets从 Smogon 统计 URL 拉取月度使用数据核心算法是“取最常用值”importer.ts#L468-L505招式取使用率最高的前 4 个top(stats.Moves, 4)映射为招式名道具取使用率最高的道具nothing归一化为undefined特性取最高使用率特性同样过fixedAbility过滤性格与努力值从最常见的 spread形如Timid:252/0/4/0/0/252解析出nature与evs其中 spread 按 HP/Atk/Def/SpA/SpD/Spe 顺序排列每条生成配置统一命名为Showdown Usage门槛控制getUsageThreshold规定——总战斗数低于 100 时直接跳过该格式低于 400 时使用 5% 使用率门槛其余格式默认 1%而uber/anythinggoes/doublesou这类“玩家水平参差”的格式放宽到 3%。5.4 阶段四合法性校验与落盘每一条配置无论来源都要经过validSet的严格把关importer.ts#L271-L300先做skip前置过滤——例如 Primal 固拉多必须携带红色宝珠、Mega 形态必须携带对应 Mega 石、闪焰王牌等“仅战斗形态”必须满足特定特性或招式前提将DeepPartial补全为完整PokemonSettoPokemonSet个体值默认补 31二代为 30三代以上缺失努力值时给{spe: 1}表示“有意为之”二代缺失时补 252特性缺省为None调用TeamValidator.validateSet进行正式校验失败则打印Invalid set错误并丢弃该条只有两种例外可放行——因活动限定而必须闪光的配置自动补shiny: true后重验以及 Gen 4 神兽战中因合法性问题被误判的阿尔宙斯配置。值得注意的是toPokemonSet中针对觉醒力量Hidden Power做了个体值修正若当前个体值无法生成分析文章要求的觉醒力量属性会根据世代采取不同策略——二代用HPdvs换算 DVs三代及以上直接覆盖为对应属性的HPivs七代且等级 100 时则退而求其次写入hpType字段交给运行时处理。校验通过的数据会按“格式 → 数据源 → 宝可梦 ID → 配置名”的层级累积最终importGen将dex与stats数据合并为GenerationData由 tools/set-import/index.js 分别写出gen${n}.json与各格式独立 JSON。5.5 稳定性工程限速、重试与幂等抓取层做了双重防护importer.ts#L551-L635throttling将请求平滑限速到 20 QPS每 50ms 最多发 1 个请求而不是成批突发以规避gettaddrinfo ENOTFOUND与 macOS 下的ECONNRESETretrying对 5xx 状态码等可重试错误最多重试 5 次退避时间按attempt * wait * (1 random/2)递增3xx 重定向会被解析location后递归跟随。六、运行导入工具与版本管理导入工具以 tools/set-import/index.js 为命令行入口执行node tools/set-import [version]version参数的语义参数行为不传现有包版本号patch位 1minor或monthlyminor位 1、patch归零惯例是每月处理完使用统计后执行一次major或breakingmajor位 1输出格式发生破坏性变更时使用具体版本号如1.2.3直接使用该版本脚本的运行流程先执行node build编译仓库 TypeScript 源码若缺失smogon依赖则自动npm install --no-save smogon获取类型信息随后为TeamValidator所需的Chat.plural建立最小全局桩tools/set-import/index.js#L43-L53再调用编译后的importer.js拉取全部数据、清理旧的gen*.json产物并写入新文件最后生成package.json与index.js。产物就绪后在sets/目录下执行npm publish即可发布。配套的 tools/set-import/stats 脚本用于确定各格式自 2014 年 11 月以来的“总战斗数”基线它逐月抓取smogon.com/stats的纯文本统计并正则提取Total battles字段较直接下载庞大 JSON 更快输出结果作为导入器挑选统计回退日期的依据。七、数据包的典型消费场景数据包的使用遵循“按需加载”模式// 加载整个世代的配置数据 const gen9 await forGen(9); // 加载单个格式的配置数据含 dex 与 stats 两个来源 const ouData await forFormat(gen9ou); // ouData[dex][landorus-therian][Choice Scarf] DeepPartialPokemonSet // ouData[stats][landorus-therian][Showdown Usage] DeepPartialPokemonSet // 也支持对象形式 const gen8 await forGen({num: 8});从仓库使用情况看该数据包的加载模式与 Pokémon Showdown 自身的Dex.forGen(gen)/Dex.forFormat(format)高度同构——后者在 sim/dex.ts#L175-L184 中定义通过mod(gen${n})切换世代数据模组、通过格式 ID 解析对应 mod这与smogon/sets的“世代键 / 格式键”索引思路一脉相承便于在同一代码库中统一心智模型。八、小结smogon/sets本质上是一个“社区数据 官方数据”合流的可复用数据集结构五层嵌套世代 → 格式 → 来源 → 宝可梦 → 配置名配以DeepPartialPokemonSet的宽容类型兼顾完整配置与稀疏生成的配置数据源dexSmogon 分析文章需授权与stats官方天梯统计MIT双轨并存质量保障导入流水线内置了格式适配等级修正、Mega 形态拆分、觉醒力量个体值换算、团队合法性校验TeamValidator、使用率门槛与网络稳定性工程限速、重试保证发布数据的可用性发布方式由导入脚本自动生成index.js/package.json/ 各世代 JSON同一份代码同时支持 Node 与浏览器环境配合npm publish即可迭代版本。对于需要在自身应用中复用成熟宝可梦配置数据的开发者直接引入该包并按forGen/forFormat的契约消费即可若需理解数据的推导过程与校验逻辑tools/set-import/importer.ts 是完整的参考实现。赞分享后端【免费下载链接】pokemon-showdownPokémon battle simulator.项目地址https://gitcode.com/gh_mirrors/po/pokemon-showdown点击查看免费下载相关推荐YouTube.js 通知节点解析深入理解 Notification 类的结构与数据来源YouTube.js 通知节点解析深入理解 Notification 类的结构与数据来源 导读 在 YouTube.js一个访问 YouTube 内部 In后端mesh2motion GLTF结果解析模型导入数据的结构处理mesh2motion GLTF结果解析模型导入数据的结构处理 在3D动画制作流程中GLTFGL Transmission Format格式已成为Web前端3D渲染图形学如何快速掌握datasketch概率数据结构的终极实现指南如何快速掌握datasketch概率数据结构的终极实现指南 datasketch是一个强大的Python库专注于实现MinHash、LSH、LSH Fore大数据上一篇不用等游戏更新DLSS Swapper 切换 DLSS、FSR、XeSS 版本只需5分钟下一篇RVC变声器实战入门用10分钟语音练出你的第一个AI音色创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表