石器百科 开始游戏

料理与合成

石器时代的合成不靠 NPC,而是靠宠物的野外技能:「加工」把石头、木头、皮、骨这类素材做成武器、防具、饰品;「料理」把肉、鱼、盐、炭这类食材做成料理。每件素材背后都有一组看不见的「成分」,服务端把成分加总、随机浮动,再到道具表里找成分刚好对得上的东西做出来。

本文前半讲怎么操作和要注意什么,后半是完整的计算规则。道具本身的属性见 道具与装备。

怎么做

  1. 让宠物学会技能:去宠物技能商店(饲育员)买「加工」(技能 200)或「料理」(技能 201)。例如萨姆吉尔的宠物店(1003 号地图,坐标 18,13 的超级饲育员)两种都卖,价格分别为 1500、1000 石币。2003(18,14)、加加的宠物店 3003(16,13)、卡鲁它那的宠物店 4003(18,15)的饲育员也有这两项。
  2. 标记素材:打开道具窗口,右键点背包里的素材。能加工的道具会标上「合成」,料理类道具会标上「料理」。同一次只能标同一种;再右键一次取消。客户端最多标 5 件。
  3. 开始:到宠物窗口的技能页,点那只宠物的「加工」或「料理」。标记的同种道具至少要 2 件。宠物会走进画面,把道具一件件顶到头上,转几圈后把结果交给服务端。
  4. 结果:材料全部消失,做出来的道具放进背包里编号最小的空格。服务端回应失败时,聊天栏会显示「失败!」。

注意:

  • 背包至少要留 1 个空格,否则「合成时,最少需空一格物品栏位!」,什么都不会发生。
  • 主人在战斗中时不能用。
  • 不能当素材的道具(itemset 的 canmergefrom ≠ 1)会被跳过,提示「似乎对××没有兴趣。」,这件道具不会消失。
  • 有效素材少于 2 件时什么都不会发生。

出处:battle/pet_skill.c PETSKILL_Merge(战斗中返回 FALSE);item/item_gen.c ITEM_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.c ITEM_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.c ITEM_initItemAtom(只读名字与 magicflg)、ITEM_getAtomIndexByName;成分栏见 item/item.c ITEM_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.c ITEM_simplify_atoms(oddstable[]、ITEM_ATOMIND_MAX 1000)。

第 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.c ItemRandTableForItem[] 与 ITEM_initRandTable(ITEM_GEN_RATE 0.7)、ITEM_MERGE_RANGEWIDTH_FORMIN 0.87 / FORMAX 1.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.c ITEM_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.c ITEM_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.c ITEM_mergeItem(CHAR_earnFame、FM_FIX_FMDEALFOOD / FM_FIX_FMSYNTHESIZE)。

实例

加工:长青苔的石(石 10)+ 腐烂的木(木 10),交给没有石 / 木修正的宠物。

  1. 合并:石 10、木 10(各一件,不叠加)。
  2. 浮动:等级 0,石、木各自变成 4~25 之间的随机整数。
  3. 两种成分,75% 先找「2 种成分」的道具,25% 先找「1 种」:
    • 合成枪1(木 10 / 石 10):两个值都在 5~24 之间时符合。
    • 合成斧头 2(石 30 / 木 30):两个值都在 13~25 之间时符合。
    • 两个值都落在 13~24 时,两者都符合,各一半机会。
    • 只有一种成分(石或木)的可合成道具不存在,所以「找 1 种」那一档必定落空。
  4. 任何一个值掷到 4 时,两件都对不上,最后只能拿回一件素材。

料理:小块肉(肉 10)+ 晒乾的炭(碳火 10)。

  1. 浮动:肉、碳火各自变成 9~11。
  2. 找「2 种」时:晒过的保存用肉乾(肉 10 / 碳火 10)必定符合。
  3. 找「1 种」时(25% 机会先抽到):只有肉一种成分的料理,例如 小点心肉(肉 10)会被选中。

合成道具的颜色与魔术笔

道具名字的颜色反映它的来历:

颜色 意思
白字 一般道具
黄字 合成 / 料理做出来的道具(ITEM_MERGEFLG = 1),包括失败或太快时还回来的那件素材
绿字 已经用魔术笔改过名字(道具记下了改名人的账号)

魔术笔(魔术笔 (油性) 只能用 1 次,取─名字 1 1 次,取─名字 ∞ 无限次):

  1. 使用后出现「要变更那个项目的名称呢」列表,共 4 页、每页 5 格,依次是装备栏和背包。
  2. 只有符合条件的道具会列出来:黄字(合成品)、不是料理、没有损坏(损坏等级 0),而且没被改过名或是自己改的。
  3. 输入新名字:最多 26 个字节(全形 13 字),至少 1 个字,不能有半形或全形空白,不能有「|」。
  4. 改的是道具栏里显示的名字(secretname);改完后道具记下你的账号,变成绿字,别人就不能再改。
  5. 魔术笔参数为 1 的用一次就消失,参数为空的可以无限使用。

出处:item/item.c ITEM_makeItemStatusString(ITEM_CDKEY 非空 → CHAR_COLORGREEN,否则 ITEM_MERGEFLG → CHAR_COLORYELLOW);item/item_event.c ITEM_useRenameItem_PrintWindow、ITEM_useRenameItem_WindowResult。

网页版说明

  • 合成逻辑(packages/tools/src/game/item-merge.ts)逐行照搬原版:成分合并、宠物修正、随机顺序、5 次重试、频率限制、声望都一致,并有 sa-merge-test.ts 覆盖。
  • 家族守护兽(可以用家族等级提高上限的分支)在网页版里不能带出来用野外技能,所以一律按普通宠物计算。
  • 原版选空行会改到那一格的道具;网页版的魔术笔窗口只让列出来的行可选。