料理与合成
石器时代的合成不靠 NPC,而是靠宠物的野外技能:「加工」把石头、木头、皮、骨这类素材做成武器、防具、饰品;「料理」把肉、鱼、盐、炭这类食材做成料理。每件素材背后都有一组看不见的「成分」,服务端把成分加总、随机浮动,再到道具表里找成分刚好对得上的东西做出来。
本文前半讲怎么操作和要注意什么,后半是完整的计算规则。道具本身的属性见 道具与装备。
怎么做
- 让宠物学会技能:去宠物技能商店(饲育员)买「加工」(技能 200)或「料理」(技能 201)。例如萨姆吉尔的宠物店(1003 号地图,坐标 18,13 的超级饲育员)两种都卖,价格分别为 1500、1000 石币。2003(18,14)、加加的宠物店 3003(16,13)、卡鲁它那的宠物店 4003(18,15)的饲育员也有这两项。
- 标记素材:打开道具窗口,右键点背包里的素材。能加工的道具会标上「合成」,料理类道具会标上「料理」。同一次只能标同一种;再右键一次取消。客户端最多标 5 件。
- 开始:到宠物窗口的技能页,点那只宠物的「加工」或「料理」。标记的同种道具至少要 2 件。宠物会走进画面,把道具一件件顶到头上,转几圈后把结果交给服务端。
- 结果:材料全部消失,做出来的道具放进背包里编号最小的空格。服务端回应失败时,聊天栏会显示「失败!」。
注意:
- 背包至少要留 1 个空格,否则「合成时,最少需空一格物品栏位!」,什么都不会发生。
- 主人在战斗中时不能用。
- 不能当素材的道具(itemset 的 canmergefrom ≠ 1)会被跳过,提示「似乎对××没有兴趣。」,这件道具不会消失。
- 有效素材少于 2 件时什么都不会发生。
出处:
battle/pet_skill.cPETSKILL_Merge(战斗中返回 FALSE);item/item_gen.cITEM_mergeItem_merge;data/petskill.txt(加工 200 价格 1500、料理 201 价格 1000,函数都是PETSKILL_Merge);data/npc/genout/psks_*(pet_skill:列表含 200,201 的店)。客户端操作见网页版packages/client/src/ui/sa/windows/ItemMix.ts(照原版 menu.cpp)。
料理和加工的区别
服务端里两个技能调用的是同一个函数,区别在于:
| 加工 | 料理 | |
|---|---|---|
| 客户端标记 | 「合成」:canmergefrom = 1 且不是料理类 | 「料理」:类型 20(DISH)的道具 |
| 需要的技能 | 加工(200) | 料理(201) |
| 服务端用哪套规则 | 第一件素材不是料理类 → 加工规则(searchtable 0) | 第一件素材是料理类 → 料理规则(searchtable 1) |
| 成分值的随机浮动 | 按成分值所在的等级,幅度从 ×0.36~×2.52(低级)到 ×0.74~×1.23(高级) | 固定 ×0.9~×1.1 |
| 找结果的范围 | 按等级:目标值 ∈ [v ÷ 倍率, v × 倍率] | 固定:目标值 ∈ [v × 0.7, v × 1.3],v 最多压到 814 |
| 能做出什么 | 武器、防具、饰品、合成矿石 | 料理(吃的、捕获饵、状态药等) |
| 能不能改名 | 能(魔术笔) | 不能 |
料理类与非料理类素材不能混在一起。真的混进去时(例如改了封包),服务端回「非法的合成方法」,材料照样全部消失,什么也拿不到。正常客户端不允许这样标记。
出处:
item/item_gen.cITEM_mergeItem_merge(items[0]是 ITEM_DISH 时randtable = 1)、ITEM_mergeItem(混合返回 -10);ItemSearchTable[]、ItemRandTable[]。
素材、成分与原子表
每件道具在 itemset 里最多有 5 组「成分名, 成分值」(第 85–94 列)。成分名必须是 data/itematom.txt 里登记的「原子」之一,2.5 数据共 83 种,例如:
- 加工常用:石、木、皮、骨、线、牙、爪、壳、鳞、黏土、叶、花、贝壳、水晶、谷,以及宝石类(红宝石、蓝宝石、绿宝石、钻石、珍珠)、金属类(铜、铁)。
- 属性与状态:地、水、火、风、毒、石化、混乱、酒醉、昏睡、回复、复活。
- 料理常用:肉、鱼、卵、米、豆、盐、胡椒、砂糖、油、碳火、饮用水、香草、大蒜、生姜,以及各种蔬菜水果和海鲜(虾、花枝、章鱼、螃蟹、海草……)。
itematom.txt 第二栏的 0/1 旗标服务端会读进来,但合成过程中没有用到。
素材按成分值分级,商店和怪物掉落的基础素材正好对齐等级表的基准值 10、30、65、125、205、305、425、565、725、905:
| 道具 | 成分 |
|---|---|
| 长青苔的石 / 光滑的石 / 球石 | 石 10 / 30 / 65 |
| 发红光的石 | 石 905 |
| 腐烂的木 / 小枝 / 神木 | 木 10 / 30 / 905 |
| 有缺陷的水晶 / 最上级的水晶 | 水晶 10 / 905 |
| 小块肉 / 最棒的肉 | 肉 10 / 225 |
| 普通的盐 / 粗盐 | 盐 10 / 26 |
| 晒乾的炭 / 加加产的高级炭 | 碳火 10 / 122 |
成分值越高,能做出的东西越高级。合成出来的装备大多既能当素材也能当结果(canmergefrom、canmergeto 都是 1),可以拿去继续合成。
出处:
item/item_gen.cITEM_initItemAtom(只读名字与 magicflg)、ITEM_getAtomIndexByName;成分栏见item/item.cITEM_itemconfentries[]的ingname0..4 / ingvalue0..4。
结果是怎么选出来的
第 1 步:合并同种成分
把所有素材的成分按原子分组。同一种原子出现多次时,从小到大排序,后一个加上「前一个 × 叠加系数 × 等级修正」:
v[j] = v[j] + v[j−1] × odds[j−1] × (倍率(等级(v[j−1])) ÷ 2.4)
odds = 0.1, 0.25, 0.35, 0.4, 0.42, 0.44, 0.46, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53
取最后一个值,上限 1000。也就是说,同种素材叠加的收益并不大:
- 石 10 + 石 10 → 11;三块石 10 → 12。
- 石 10 + 石 905 → 906(小的几乎没贡献)。
- 石 905 + 石 905 → 949。
想做高级的东西,要靠单件成分值高的素材,而不是堆数量。
出处:
item/item_gen.cITEM_simplify_atoms(oddstable[]、ITEM_ATOMIND_MAX1000)。
第 2 步:成分值随机浮动
每种成分各自随机一次(ITEM_randRange:base × 下限‰ ~ base × 上限‰,四舍五入后均匀取整)。
料理:浮动 ×0.9~×1.1。
加工:先查成分值所在的等级,等级越低浮动越大:
| 等级 | 成分值范围 | 倍率 | 浮动范围(×) |
|---|---|---|---|
| 0 | 0–24 | 2.400 | 0.36 ~ 2.52 |
| 1 | 25–54 | 1.800 | 0.48 ~ 1.89 |
| 2 | 55–107 | 1.646 | 0.53 ~ 1.73 |
| 3 | 108–181 | 1.448 | 0.60 ~ 1.52 |
| 4 | 182–275 | 1.341 | 0.65 ~ 1.41 |
| 5 | 276–389 | 1.275 | 0.68 ~ 1.34 |
| 6 | 390–523 | 1.231 | 0.71 ~ 1.29 |
| 7 | 524–677 | 1.198 | 0.73 ~ 1.26 |
| 8 | 678–851 | 1.174 | 0.74 ~ 1.23 |
| 9 | 852–1059 | 1.170 | 0.74 ~ 1.23 |
(倍率 = 本级上限 ÷ 本级基准值;本级上限 = 基准 + (下一级基准 − 基准) × 0.7。浮动下限 = 0.87 ÷ 倍率,上限 = 1.05 × 倍率。)
宠物修正:宠物模板(enemybase.txt)可以对最多 5 种原子设「修正最小 / 修正最大」(千分比)。素材里有这种原子时,改用:
- 加工:下限 × 修正最小 / 1000,上限 × 修正最大 / 1000;
- 料理:上下限都乘修正最小 / 1000(原版写法如此)。
原版数据里大多数宠物的修正都小于 1000,例如 乌力 对石、木、皮、骨、线都是 700,会让这些成分偏低;也有大于 1000 的,例如 石龟 对石是 1200,会偏高。素材里的原子不在宠物修正清单上时,按上面的一般规则浮动。所以同一组素材交给不同的宠物,做出来的东西可能不一样。
出处:
item/item_gen.cItemRandTableForItem[]与ITEM_initRandTable(ITEM_GEN_RATE0.7)、ITEM_MERGE_RANGEWIDTH_FORMIN0.87 /FORMAX1.05、ItemRandTable[]、ITEM_merge_getPetFix(_FMVER21:minadd = 0 + ATOMFIXMIN)、ITEM_randRange。
第 3 步:在道具表里找结果
服务端在道具表中找 canmergeto = 1、而且不是这次用到的素材之一的道具。候选道具的每一种成分都必须在你的成分里找到,并且数值落在范围内:
- 加工:候选值 ∈ [v ÷ 倍率(等级(v)), min(v × 倍率, 1000)]
- 料理:v 先压到不超过 814(等级 9 上限 1059 ÷ 1.3),候选值 ∈ [v × 0.7, v × 1.3]
此外,候选道具的成分种类数必须刚好等于这一轮要找的种类数。你的素材可以有多出来的成分,但候选道具不能有你没有的成分。
这一轮要找几种成分是随机的(设你的成分有 n 种,n 超过 5 时按 5 算):
| n | 找 n 种 | 找 n−1 种 | 找 n−2 种 | 找 n−3 种 | 找 n−4 种 |
|---|---|---|---|---|---|
| 1 | 100% | ||||
| 2 | 75% | 25% | |||
| 3 | 60% | 25% | 15% | ||
| 4 | 30% | 44% | 19% | 7% | |
| 5 | 26% | 24% | 30% | 16% | 4% |
抽中的那一档如果找不到结果,就再抽,直到每一档都试过为止;某一档找到符合的道具时,在所有符合的道具中平均随机挑一件。整个过程最多重试 5 次。
出处:
item/item_gen.cITEM_merge_with_retry(idel_num[5][5]、hitnum == inguse == extractnum、ITEM_merge_checkitem排除素材本身、matchid[random() % match])、ITEM_mergeItem(for i < 5重试)。
第 4 步:生成道具
做出来的道具和商店买的一样,按 itemset 的最小 / 最大值栏随机决定能力(见 道具与装备 的「数值的随机浮动」),然后打上「合成品」标记(ITEM_MERGEFLG = 1)。
成功、失败与惩罚
每次合成,放上去的有效素材一定全部消失,结果分以下几种:
| 情况 | 你得到的 | 提示 |
|---|---|---|
| 找到结果 | 做出来的道具(黄字) | — |
| 5 次都找不到 | 随机还你一件素材(新生成的,也会变成黄字) | 无 |
| 按得太快 | 随机还你一件素材,不计算结果 | 红字「合成料理过於频繁,休息一下比较好哟。」 |
| 素材里没有任何认得的成分 | 什么都没有 | 无 |
| 料理类和非料理类混在一起 | 什么都没有 | 「非法的合成方法」 |
频率限制
距离上一次合成不到 5 + (素材件数 − 2) 秒就算「过於频繁」:2 件素材要等 5 秒,3 件 6 秒,5 件 8 秒。被判定过快时计时也会重新开始,所以连续狂按只会一直被罚。客户端的宠物动画本身就要花几秒,正常操作一般不会碰到。
出处:
item/item_gen.cITEM_mergeItem(nowtime - CHAR_WORKLASTMERGETIME < 5+(num-2),返回items[RAND(0,num-1)];5 次失败同样返回随机一件素材)、ITEM_mergeItem_merge(先删素材,再ITEM_makeItemAndRegist(ret)并设ITEM_MERGEFLG)。
声望
做出东西时,主人会得到个人声望(_PERSONAL_FAME)。计算用的是结果道具在道具表中的成分值:
- 加工:成分值总和 ÷ 200(取整)
- 料理:√(成分值总和) × 2^(成分种数 − 2) × RAND(0, 6) ÷ 200(取整)
低级道具的声望算出来基本是 0,要做成分值很高的东西才有明显收益。原版主人有家族时,这个数值还会作为「料理 / 合成」贡献上报家族;网页版目前只实现了个人声望。
出处:
item/item_gen.cITEM_mergeItem(CHAR_earnFame、FM_FIX_FMDEALFOOD/FM_FIX_FMSYNTHESIZE)。
实例
加工:长青苔的石(石 10)+ 腐烂的木(木 10),交给没有石 / 木修正的宠物。
- 合并:石 10、木 10(各一件,不叠加)。
- 浮动:等级 0,石、木各自变成 4~25 之间的随机整数。
- 两种成分,75% 先找「2 种成分」的道具,25% 先找「1 种」:
- 任何一个值掷到 4 时,两件都对不上,最后只能拿回一件素材。
- 浮动:肉、碳火各自变成 9~11。
- 找「2 种」时:晒过的保存用肉乾(肉 10 / 碳火 10)必定符合。
- 找「1 种」时(25% 机会先抽到):只有肉一种成分的料理,例如 小点心肉(肉 10)会被选中。
合成道具的颜色与魔术笔
道具名字的颜色反映它的来历:
| 颜色 | 意思 |
|---|---|
| 白字 | 一般道具 |
| 黄字 | 合成 / 料理做出来的道具(ITEM_MERGEFLG = 1),包括失败或太快时还回来的那件素材 |
| 绿字 | 已经用魔术笔改过名字(道具记下了改名人的账号) |
魔术笔(魔术笔 (油性) 只能用 1 次,取─名字 1 1 次,取─名字 ∞ 无限次):
- 使用后出现「要变更那个项目的名称呢」列表,共 4 页、每页 5 格,依次是装备栏和背包。
- 只有符合条件的道具会列出来:黄字(合成品)、不是料理、没有损坏(损坏等级 0),而且没被改过名或是自己改的。
- 输入新名字:最多 26 个字节(全形 13 字),至少 1 个字,不能有半形或全形空白,不能有「|」。
- 改的是道具栏里显示的名字(secretname);改完后道具记下你的账号,变成绿字,别人就不能再改。
- 魔术笔参数为 1 的用一次就消失,参数为空的可以无限使用。
出处:
item/item.cITEM_makeItemStatusString(ITEM_CDKEY非空 →CHAR_COLORGREEN,否则ITEM_MERGEFLG→CHAR_COLORYELLOW);item/item_event.cITEM_useRenameItem_PrintWindow、ITEM_useRenameItem_WindowResult。
网页版说明
- 合成逻辑(
packages/tools/src/game/item-merge.ts)逐行照搬原版:成分合并、宠物修正、随机顺序、5 次重试、频率限制、声望都一致,并有sa-merge-test.ts覆盖。 - 家族守护兽(可以用家族等级提高上限的分支)在网页版里不能带出来用野外技能,所以一律按普通宠物计算。
- 原版选空行会改到那一格的道具;网页版的魔术笔窗口只让列出来的行可选。