Imported from YrianZhao/Fan_Banter_Trainer (
AGENTS.md). Install upstream withnpx skills add YrianZhao/Fan_Banter_Trainer. Copyright stays with the author.
Fan Banter Trainer 项目规则
- 项目是可部署到 GitHub Pages 的纯静态 React + TypeScript + Vite 游戏,不依赖服务端数据库。
- 首版界面与题库文案使用简体中文,玩法围绕 NBA 球迷事实吐槽训练。
- 产品核心竞争力是题库资料和选项内容;UI 改动服务于训练节奏,但长期优先级应放在资料搜集、争议梳理、攻击角度和选项质量上。
- 题库采用结构化数据模型:
entities保存球队/球星,topics保存争议主题,attackLines保存敌方先手话术,responseOptions保存回复选项与解释。 - 管理员维护方式为浏览器内导入/编辑/导出 JSON,数据暂存在 localStorage;导出的 JSON 需要提交回仓库才会成为正式题库。
- 内容边界:以公开篮球事实、比赛表现、季后赛失利、转会争议、伤病争议、判罚争议、荣誉比较、球迷 meme 等吐槽为主;可以使用公开且可来源化的场外争议素材,但避免人身威胁、仇恨言论、人肉信息、无来源严重指控和不可验证的私生活传闻。
- 移动端是核心使用场景;修改 UI 后需要检查小屏布局,避免横向滚动、按钮文字溢出和选项不可点击。
- 记忆训练移动端应优先保持类 iOS 的单卡片体验:顶部横滑队伍选择、紧凑统计、核心训练卡、底部固定评级操作区;侧栏和校验信息在手机上隐藏或降噪。
- 手机记忆训练页应尽量保持 100svh 单屏体验,不让页面主体上下滚动;长答案、来源或口径说明可以在卡片内部小范围滚动。
- 记忆训练桌面端应使用紧凑、克制的训练工具布局:顶部是轻量状态条,主卡片字号不得英雄化,侧栏和题库状态面板保持低噪声,避免大块解释文字和重阴影卡片堆叠。
- 记忆训练来源、事实等级和安全口径默认折叠到
Learn About,主卡片优先展示问题、记忆点和可直接背的攻击句。 - 游戏回复选项按钮应显示简短、像真实对喷会说出口的句子;训练说明、有效性分析和上下文解释放在选择后的
explanation中。 - 题库选项要避免模板同质化;正确回复应有“承认事实 + 有攻击性的反击”两段,错误选项也要按争议类别变化,但仍避免仇恨、威胁和无来源严重指控。
- 默认每条攻击线至少 6 个选项,选项要有论坛互喷感和争议性;可参考公开论坛语气抽象成原创模板,但不要复制评论原文或引入仇恨、威胁、人肉、无来源严重指控。
- 题库内容量目标持续扩充;每个 topic 可通过生成层派生多条同主题攻击线,但新增语料必须有不同攻击角度,避免只做同义重复。
- 正确选项必须同时满足“证据反驳贴题”和“后续反击也打中对方阵营/争议”。可以设计“前半证据正确但后半回怼错位”的干扰项,并标记为错误。
- 队伍专项记忆训练采用类似背单词的问答卡片模式,使用
src/data/*MemoryDeck.ts结构化题库和 localStorage 复习进度;单队专项目标至少 300 张卡片。 - 多队记忆训练通过
src/data/memoryDeckTypes.ts、src/data/memoryDeckFactory.ts和src/data/memoryDecks.ts维护;新增球队时先建独立*MemoryDeck.ts,再注册到memoryTeams。 - 记忆训练应覆盖 NBA 30 支球队且全部为深度包;测试需要强制
memoryTeams.length === 30且每队至少 300 张卡片。 - 生成型球队深度包可由球队痛点配置生成,但 UI 来源备注必须说明生成口径;后续迭代优先把生成型概括卡替换为逐事件、逐年份、逐来源的人工精选卡。
- 记忆训练卡片需要区分
verified、widely_debated、opinion、meme、forum_claim;无来源论坛梗/传闻型话术只能作为识别与拆解素材,必须明确“不能包装成已证实事实”。 - 记忆训练题库质量优先于派生数量;凯尔特人等深度包允许使用专用 prompt styles,减少同一素材的机械重复,优先保留能打痛点、语气更像论坛实战的原创话术。
- 记忆训练可用
priority标记高压实战卡;新用户和空进度训练应优先看到爆点更强、语境更贴近实战的卡,而不是按年份或 id 机械排序。 - 记忆训练应提供“高压实战 / 全量题库”强度模式;默认高压实战先练可直接对线的爆点卡,全量题库用于系统补课。
- 高压实战记忆卡应尽量提供
drill:opponentLine、bestComeback、trapComeback、trapReason,用于训练“对方怎么洗、我方怎么打、哪些狠话会错位扣分”。 - 高压实战
drill卡在 UI 上应先让用户选择回怼,再揭晓正确/陷阱解释和记忆评级;不要退回成先看答案的普通闪卡。默认应提供 1 个最佳回怼 + 至少 3 个不同类型陷阱选项。 - 虎扑、贴吧、Reddit、RealGM、InsideHoops 等论坛平台可作为“社区语料来源”,用于抽象高频攻击角度和论坛语气;不要复制原评论,不要把社区语料包装成已证实事实。
- 场外案件、家庭暴力、司法事件等严重素材只能写公开报道或司法进展;被撤案、未定罪、传闻型内容必须在文案里保留限定,不得改写成确定事实。
- 对战结算选择后应自动扣血并进入下一回合或结算页,不使用手动“下一回合”按钮;HP 变化需要有清晰动画反馈。
- 回合制是两段式:敌方先攻击,玩家先选反驳;反驳后进入玩家主动攻击选择。攻击选错或不匹配也要扣自己血,攻击选对才对敌方造成主要伤害;机器人敌方默认能正确回应,只作为流程反馈。
- 房间号 1v1 需要实时后端或同步服务;GitHub Pages 静态版只能保留入口和说明,不能假装已经支持实时对战。
- 常用命令:
npm install、npm run dev、npm test、npm run build、npm run preview。 - GitHub 仓库:
https://github.com/YrianZhao/Fan_Banter_Trainer。 - 线上地址:
https://yrianzhao.github.io/Fan_Banter_Trainer/。 - 部署方式:GitHub Pages 使用
.github/workflows/deploy-pages.yml的 Actions workflow,推送到main后构建dist并发布。
