结缘、同伴,以及卡住它们的两个数字

这个游戏里每一步社交动作(写信、索要东西、拜师、结缘、带在身边),卡的都是同一对数字, 而整套系统一共只有六道门槛。而且对这个世界里几乎每一个人来说,这还是同一条阶梯:没有可攻略 角色名单,没有一人一套的要求,结缘选项上也没有剧情标记。一张数据表里的一行,一次性给所有人 打开了它。

这条阶梯

这些是同一张表里的若干行,全部挂在伪角色id1上,游戏会把这一批行合并进每一个角色的交互菜单 (NpcInteract.GetNpcInteractsByNpcID)。把鼠标悬停在置灰的按钮上,游戏会把要求原样写 出来,下面的措辞就是这么核实的。

步骤 好感 情分 出现在谁身上
交谈/交互/赠礼 — — 所有人
谈论/诋毁/探听 — — 所有人
飞鸽传书 5 150 所有人
请教 5 150 所有人
索要 20 — 所有人
拜师 50 1500 仅随机角色
结缘 75 3500 所有人,异性,非儿童
结义 75 3500 所有人,同性
邀请同行 75 3500 仅随机角色

其中两行带着一个标志位,把它们限制在程序生成的角色上,也就是地图上的蓝点。拜师和通用的招募 选项永远不会出现在具名剧情角色身上,不管你把数字堆到多高。能招募的具名角色各自有一行属于 自己的条件,而那些行里没有一行要好感或情分(见招募)。

还有几条会把这张表进一步收窄:

程序集里另外还有一份写死的同样检查,拜师要40,结缘和结义要70 (RelationShipManager.IsReachNpcHaoGan)。这一份不生效。它只有两处调用,都在 InteractOnChat.InitData里,而整个程序集里没有任何地方调用这个方法。实际生效的是上面那些 数据条件。

情分不是第二条线:它转成好感,到75彻底停住

社区吵了两年的就是这个机制,而它一共八行代码。

每次你和某人的情分上涨,游戏就把你和这个人的累计情分总额除以1000,每跨过一个新的一千就 加+1好感,然后把这次奖励夹住,让它永远不能把你推过好感75 (RelationShipManager.ModifyQingFenValue)。本该把你推过75的那几次,直接被消耗掉,不会留着。

所以:

这两个数各自还都存了两份。m_QingFen是可以花的池子,请教和索要烧的就是它。 m_QingFenRecord是只增不减的累计值。阶梯上的条件读的是累计值(条件行以|1结尾, 选的就是它),所以花情分永远不会让你掉一级。学一门12,500情分的秘技,你的结缘资格一点 不受影响。

有两件事会悄悄把这条转化掐掉:它只在情分上涨时才跑;而且它要求这个角色是已加载的实体—— 转化率要通过对方的性格查出来,而没加载的角色没有性格。

什么能推动这两个数,从快到慢

下面的内容全部是从程序集里读出来的。这张表里没有一条是在游戏里实测的。

行为 好感 情分 消耗 出处
谈论——聊第三个人 成功+30,约51% — 20精力 RelationPanelNew.HaoGanHandle
诋毁——说第三个人的坏话 成功+30,失败−30 — 20精力 同上
委托——交付一单 按阶+5/7/9/11/13/16/20 150/180/220/270/330/405/495 跑腿本身 EntrustManager.DoFinisedEntrustAction
赠礼——一件对方喜欢的七阶物品 按口味+9到+16,手工指定的最爱+32 按口味420–1150 物品本身 见送礼的准确算法
切磋——赢一场 +8 — 精力,仅随机角色 CommonTipView.OnQieCuoOver
论道——赢一局 +5 — 精力,仅随机角色 LunDaoMainView.GameOver
誓好信 +5 — — MailManager
切磋——输 +1 — —
论道——输 +1 — —
巧取——偷他东西 −5 — 精力 ShowItemView
劫杀——抢一个人 他的朋友和配偶直接设为−50;他的仇人+5 — RelationShipManager.OnRobNpcCompleted

谈论是全游戏涨好感最快的手段,也是唯一一个在具名角色身上还管用的快路子。它花20精力,判定略高于 一半(Random.Range(0,100) <= 50),给参与的两个角色各30,两人之间再加30。期望是每次约 15好感,而切磋赢一场只有8,还只能对随机角色用。谈论失败什么都不给,也只赔掉那点精力; 诋毁失败要扣你30,所以除非你就是想让他们两个闹翻,否则没有理由选它。

它唯一的要求是有个可聊的对象:你要从对方的关系列表或者你自己的关系列表里挑一个第三人,所以 关系列表空着的人,你就无从谈起。

委托是情分最好的来源,一单七阶委托给495,而一件礼物只有几百,另外还附带20好感。这两个数 都不是数据表里的,是程序集里写死的数组。通用的那条委托选项同样是仅随机角色,但大约700个角色 自己带了一行委托,所以这条限制没有看上去那么紧。

两个属性乘算,一个属性加固定值

容貌给玩家拿到的每一次正向好感增益加一个固定值 (RelationShipManager.CheckRongmaoAddHaogan),按一张阶梯给:

容貌 加成
≤ 10 0
11–35 +1
36–100 +2
101–180 +3
181–250 +4
251–290 +5
291+ +6

它加在下面那些乘算之前,而且每送一次礼、每切磋一次、每交付一单委托都算一次,所以它的分量 比"固定六点"听上去要重得多。对一件基数3的礼物来说,这就是翻倍。

琴艺和酒量是那两个乘数,而且它们只能通过装备栏的特技生效:

两个都必须装上,光有不算;只有装备中的特技才参与计算(StuntManager.RefreshPrototypes), 而且每个槽位只有一个特技生效。没有特技,这次查表返回零,属性本身完全不起作用。枚举里还有 第三个槽位,用于委托好感加成,但数据里没有对应的特技,所以目前是空的。

门派好感算进这些门槛

RelationShipManager.GetHaoganValue是每一道门槛都要读的那个函数,它在原始值上加 ceil(sect_standing / 20) × 5,用的是你在这个角色所属门派里的门派好感。门派好感100时, 就是对这个门派的每一个成员固定+25好感,而且它算进结缘和招募需要的那个75里。它是读取时 才加上的,不会写进存下来的数值,一退出门派就没了。门派好感为负时按同样方式扣,最多扣25。

也就是说,想和门派里的人结缘,最省的路子往往不是送礼,是刷门派悬赏。

送礼的准确算法

同一件物品上跑两套独立的换算,确认之前面板会把两个数都预览出来 (RelationShipManager.ModifyHaoganValue(…, Item, …))。

好感  = base + floor(base/2) × item_level
情分  = base × (1 + quality × 0.15 + item_level × 0.4 + enhancement × 0.01)

物品的阶和品质都是从0开始存的,所以七阶物品在公式里的level是6,品质取值0–4。于是一件七阶礼物把 好感那一项乘6,给情分的乘数加2.4。

两个基数都来自收礼人最高的那项性格属性,游戏每次都从他面板上的八项里重新挑一次 (Gift.GetNpcTendencyAttri;并列时取下表里靠前的那一项)。他的信息页把由此得出的口味显示 为兴趣。

对方最高的属性 好感基数 情分基数 喜欢 讨厌
福气 3 105 礼品、食物、酒、画卷 技艺书、丹药
容貌 4 288 戒指、项链、挂坠、画卷 酒、技艺书
口才 3 105 丹药、技艺书、食物、画卷 戒指、挂坠
商道 3 105 技艺书、酒、礼品、画卷 食物、丹药
胆识 3 105 酒、食物、丹药、画卷 戒指、礼品
修养 4 196 技艺书、挂坠、礼品、画卷 食物、丹药
坚韧 4 196 丹药、酒、戒指、画卷 项链
豪爽 3 105 食物、礼品、丹药、画卷 项链、挂坠

八种口味都喜欢画卷。全游戏有三十六件物品挂着这个分类,而画卷是唯一一种完全不需要了解 对方就能送的礼物。它也是唯一一类你能自己造的礼物:画道这门生活技能就产它。

同一件东西,送给容貌最高的角色,拿到的情分差不多是送给福气最高的角色的三倍。一幅七阶品质4的 画卷,给前者是1152情分,给后者是420,按转化算,1152已经不止一整点好感。

坚韧那一行把酒同时列进了喜欢和讨厌;代码先判喜欢,所以讨厌那一条不生效。

全游戏只有四个角色有手工指定的最爱物品,基数是8而不是3或4,七阶的能给到32好感:

角色 物品
六婶、村长夫人 绢花、墨条
霖虹 荷包、阳江香
李三问 元正酒

另有三行列出了特定的讨厌物品(狗皮膏药、醒脑丸/养气散、百灵丹,分别对应霖虹,霖虹/王铁, 张蓉榕),还有五个角色开局就带着好感:张蓉榕、霖虹、王铁和村长是10,灵均是25。

送礼面板有两点值得知道:

招募

名册上限是9,能上场3个。TeamManager.MAX_TEAM_COUNT是10,MAX_DEPLOY_COUNT是4,但两处 判断都写成count >= MAX − 1,所以真实上限是招募九个、上场三个(TeamManager.AddTeamMember、 DeployMember)。这个上限只管主队;剧情脚本安排的随从和临时同伴走的是另外的列表, GetAllPlayerTeam()会把它们叠在上面一起返回。

随机角色走标准的75/3500,没有别的条件。

具名角色各需要一行属于自己的条件,而这33行里没有一行读好感或情分。它们卡的是任务、对话 或者一场架,要求直接印在锁着的按钮上:

条件 谁
打赢他 求败、诗仙、胖子、七公、岳靖魔、萧盖世、段风流、雄八
完成特定的对话或任务 高枫芸、云烟、六婶、江雪晴、幽影、白霜茗、柳如烟、空慧、东方不败、蓉儿、陆可儿、阿贞、潘金莲、小龙女、灵儿、上官淑、司青寒、花如是
完成杨家霸王枪 杨铁心(两行)
玉沙告急,或当上丐门掌门 郭大侠
等待小妙游历结束(一封信完成) 小妙,她的成年版通过一个悬赏
没有任何条件 猹猹
任务链,然后打赢她 镜无双

猹猹是例外:它那一行招募在显示过滤和上锁条件里都没有任何要求,所以一问就跟。

注意这张表上没有谁。灵均没有招募行;社区说灵均在真结局之后会加入,那应该是脚本调用而不是 菜单选项,这和数据对得上。另外,多少情分都招不来镜无双;7,000、20,000、50,000都失败的反馈 是对的,因为她那一行不读情分。

结缘

几乎所有人都能结缘。结缘选项来自那一行全局条件,所以资格判定很短:异性、非儿童、非宠物、 好感75且累计情分3500。社区里那些结缘了村长夫人、结缘了老婆婆、手滑点错结缘了任务角色的反馈, 都不是程序出错,就是设计如此。

有四个角色(都是绝影楼密探)自带结缘行,且没有任何条件。

性别不是在数据里卡的,是在菜单里。InteractTip.onInteractClick用 player.IsFemale() != target.IsFemale()过滤展开的子菜单来判结缘,结义用的是==。性别来自 角色基础记录上的一个标志位——4是男,8是女——而游戏里有291条基础记录两个都没有,游戏自己的 错误日志把这当成数据缺失报了出来;这些一律按男处理。

同一个方法里还有第二处更早的过滤,判的是完全不同的字段(角色的标志位掩码,里面存的是首领位 和精英位,对每一个具名角色都是0)。它挂在"交互没有分组"那条分支上,走到它就会把结缘对所有人 隐藏。数字明明够了但选项没出现时,知道有这么个东西存在是有用的。

开口问是一次概率判定,可以反复来。结缘、结义和拜师都按同一个共享常量 Tools.NPC_INTERACT_RATE = 0.6做判定,也就是60%成功率,失败除了一句拒绝的台词以外没有任何 代价。再问一次就是了。代码里没有任何地方记录拒绝次数,所以社区说的"月兰第一次不答应,第二次 或者第三次就答应了"是这个判定,不是写死的剧情拒绝。

结缘是排他的,而且游戏是悄悄执行的。RelationShipManager.AddJieYuan会找玩家身上已有的 生效关系,把它标记为失效,再写一条"关系解除"的记录,所以和新的人结缘,就自动和原来那位断了。 游戏里没有单独的解除指令;再结一次缘,那一下就是解除。在这之前会弹一个提示框,把你现在的配偶点名 说出来,但那个框上的确认按钮直接就走到判定。

结缘几乎什么都不做。AddJieYuan写下的东西是:一条关系记录,你生平里的一行,以及双方身上 一个标志位,用来阻止世界模拟再把他们和别人配到一起。程序集里没有任何地方去读这个已婚状态, 用来改对话、开商店、给增益,或者让配偶跟着你走。社区两年来"纯摆设"这个共识,对着代码看是站得住的。

还有第二条路,而且是必成的。NPC可以写信来向你提亲,接受这封信调用的是 RelationShipManager.CreateMarryRelation,没有成功判定。直接就成了。提亲信由 SendMailHandle生成,它要的同样是75/3500(它就是去查同一行交互并对它的条件求值),另外还要: 异性、活着,并且是飞鸽通信对象,也就是至少完成过一次书信往来、好感高于5。每一批发出六封, 从所有符合条件的人里随机抽。结义那封对应的信要求同性。

最好的奖励卡在情分停下的上一档

从师父那里学秘技,价钱用情分算,门槛卡在好感的档位上,数据来自qingjiao_prototype:

内容 需要的好感档位 情分
一次生活技能请教 按档位:互通名姓/相交意气/莫逆之交 80 / 350 / 800
秘技,普通(品质0–1) 相交意气(≥26) 3400
秘技,稀有(品质2–3) 莫逆之交(≥51) 6500
秘技,金色(品质4) 生死与共(≥76) 12500

最后一行就是75这么要命的原因:转化正好停在75,而金色秘技要76。

不过这个检查只是做样子。在QingJiaoView.SetContentPrefab里,生活技能的按钮只有在档位 解锁之后才挂上点击回调,而秘技的按钮是无条件挂的。那一行的标题上照样画着一把锁,点下去 照样能用。点击时真正校验的只有一件事:你的情分够不够。这和玩家反馈的"没解锁档位也买到了 金色秘技"对得上,也就是说,一条金色被动的实际要求就是拜师(50/1500)加12,500情分,再没别的。

什么是真正不可逆的

社区的说法,哪些站得住

对照了TapTap 江湖2攻略组的新手指引、 它的NPC培养姊妹篇、 秋枫笙陌的新手攻略、 游侠网的关系系统文章、 门派攻略,以及大量百度贴吧帖子。

说法 结论
飞鸽5/150,请教5/150,索要20,结义·结缘75/3500,招募75/3500 全部正确,游戏就把它们印在锁着的按钮上
拜师需要情分3500 错,是1500。唯一一篇在相邻两句里同时给出两个数的攻略,第一次写的1500是对的;后来的转载挑错了数
"情分到阈值就涨好感;每个角色阈值不同;10,000左右能把普通角色顶满" 对一半。转化确实存在。阈值是固定的每1000一点,八种性格完全相同——10,000情分是+10好感,不是一整条——而且被硬夹在好感75
"无限送礼,情分30000+,好感只在75不动了" 完全正确,而且现在有解释了。夹住它的是75 − 当前好感
"显示+0,但是一直送还是能加好感" 对。+0说的是直接那一项;真正在加的是那条转化
"50以上送三次才加一次,一次约2点" 这个版本里复现不出来。代码里没有任何东西在50这里改送礼速率。按角色设好感上限的机制(Npc_HaoGan)确实存在,也确实接进了每一次增益,但出厂时那张表一行都没有——而且就算有行,它是按行id而不是角色id取的,只会碰巧对上。2024年某个把那张表填了的版本,表现会和反馈的一模一样
生死与共到不了 靠送礼到不了。谈论、切磋、委托和论道能到,这几样都不经过那个夹子
容貌提高送礼收益;"长得帅再+1" 对,而且是对每一次正向增益从0到6的固定阶梯,不是百分比
修养提高情分收益;豪爽让索要更便宜;胆识影响切磋 代码里没有。修养和豪爽只作为收礼人的口味分类出现。真正给情分做乘算的是酒量,通过一个装上的特技。豪爽是你送礼拿到的属性,不是拿去花的
"这游戏里没有亲和和酒量" 两点都错,而且这个混淆来自把内部名读错了。内部名QinYi是琴艺,不是亲和——而琴艺和酒量恰恰就是给好感和情分收益做缩放的那两项属性,各自通过一个专门的可装备特技(短歌微吟、一醉累月),450解锁,1000封顶在+100%
门派好感和个人好感是两套互不相干的系统 错。门派好感会给你对该门派每一个成员的有效好感加上ceil(standing/20) × 5,而且算进75那道门槛
"上阵3个";"可以带9个的" 都对,而且都是代码里的数——名册9个,场上3个
随机角色75/3500就能招;具名角色要走身份任务 对,而且代码比这说得更严:33行具名招募里没有一行读好感或情分
金色被动约12,000–13,500情分;绿色约4,000,蓝色约7,000 3400/6500/12500,出自qingjiao_prototype
"那个不用解锁就能学"(秘技上的档位锁不起作用) 对。秘技的按钮是无条件挂上的;只校验情分
结缘是排他的,没有解除指令,"结缘另外一个自动斩断" 对,而且断开这件事是自动的,也没有任何提示
结缘没用——"毛用没有,纯摆设" 对。除了世界自己的配对逻辑,没有任何东西读已婚状态
任何异性角色都能结缘,包括一条狗 对——它就是一行全局条件。那条狗大概是一条没有性别位的基础记录,会被当成男性
主要女角色的结缘"要在海上某个特定地点" 没有这回事。除了四行绝影楼密探之外,不存在任何针对具体角色的结缘条件,而那四行一个条件都没有
切磋给+2 赢+8,输+1——但只算普通切磋。门派、牢房和侠谷里的切磋被明确排除在外,而且这个选项只在随机角色身上有
杀掉一个角色的仇人会涨他的好感(开发者说法) 劫杀这条确认了,+5,加给所有被害人敌视的人。它和"被害人喜欢的人全部−50"是捆在一起的。劫杀流程之外的普通击杀没有追下去
一单委托能一次给+17 接近——数组按阶是5/7/9/11/13/16/20,而且这还是在容貌和琴艺乘数之前
索要花的情分"由物品决定" 对。价格是按物品分类给的基数(普通药材15,主线任务物品5760),乘上1 + quality×0.15 + level×0.4 + enhancement×0.01,再按好感超过50的每一点打4%的折——所以最高的20%在好感55就到了
情分可以是负的 和代码一致——没有任何地方给它设下限
没有收徒 对。不存在这种交互类型

社区材料里完全没有提到谈论——全游戏最快的好感来源,每个角色身上都有,速率是切磋的四倍。

这些是从哪里读到的

RelationShipManager全部(ModifyHaoganValue两个重载、ModifyQingFenValue、GetHaoganValue、 CheckMenPaiHaoGanChange、CheckRongmaoAddHaogan、SetHaoGanValue、AddJieYuan、AddShiTu、 CreateMarryRelation、CheckPlayerExpWithNpc、CanPresentNpc、IsArchiveHaoGanLevel、 SendMailHandle、OnRobNpcCompleted);Gift全部;NpcInteract.GetNpcInteractsByNpcID; RoleInteract.GetNpcInteracts;InteractSlot(Handle_IT_JIEYUAN、Handle_IT_PRESENT、 Handle_IT_TanLunNpc、OnPresent);InteractTip.onInteractClick; RelationPanelNew.HaoGanHandle;InteractOther.GetQingYiPrice/QingYiBuyJudge;QingJiaoView; TeamManager;StuntManager.GetStuntEffectValue/RefreshPrototypes; EntrustManager.DoFinisedEntrustAction;LunDaoMainView.GameOver;ItemStorage.GetPresentItems; MailManager(ExchangeHandle、NpcPresentHandle、MarryHadle); AnswerViewNew.CheckFriendshipValue/CheckEmotionValue。

数据表:npc_interact(那条阶梯)、gift(全部115行)、qingjiao_prototype、npc_haogan (空表)、base_probability(它确定了物品的阶和品质都从0开始)、stunt_proto、 npc_prototype/npc_prototype_base(名字、性别位、儿童位)、item_base。

以上没有一条是在游戏里实测的。在跑的存档是一个全新角色,所有好感都是零,修改器的只读接口 只用来确认这条阶梯在真实角色身上确实按上面引用的原文渲染出来。考虑到这个项目上一轮实测把一张 已经发布的属性表整个推翻了,在核实之前,请把这里的每一个数值都当成代码里写的。

最值得实测的四件事,按顺序:

  1. 情分转好感。对一个好感在75以下的角色连送一串礼物,在游戏自己的面板上盯着情分和好感, 确认每1000加1,然后推过75,确认它停下。
  2. 谈论。对一个角色做二十次,数成功次数和每次涨多少,对照预测的51%×30。
  3. 送礼公式里的物品阶是不是真的从0开始。给同一个角色送一件一阶和一件七阶的同类物品, 两次操作就能分开:预测值是base和base + 6×floor(base/2)。
  4. 索要的价格。它查物品分类时是拿一个StringBuilder和一个字符串做比较,只有编译器选了 span重载才绑定正确;要是选了object重载,价格永远是零,NPC身上的一切都白拿。有玩家反馈过 5,001情分的价格,说明它大概是绑对了,但面板会把这个数印出来,看一眼就定了。