工程参考/配置文件/Public/RandShop

来自天龙知识库
跳到导航跳到搜索


首页 · 配置文件索引 · 修改约定

RandShop 目录是随机 NPC 商店的商品池。ShopTable 只决定哪家店随机、抽出几件、用哪种货币;具体候选物品在对应 INI。15 个样本文件共用同一套读取规则,集中在本页说明。不要按文件名猜测用途,也不要把未引用的 petskillshop.ini 当成已上架商店。

位置与生效 · 文件格式 · 字段详解 · 修改实例

文件位置与生效

项目 说明
运行文件 ../Public/Config/RandShop/ 下各 INI,路径写在 ShopTable 第 14 列,相对于 Server 工作目录。
读取程序 Server 在 ShopTable 第 13 列非 0 时按第 14 列路径加载;NPC 场景 shop0..shop3 绑定后抽选上架
生效方法 与 ShopTable 一起备份。停服后修改实际 Public 副本,再重启 Server。当前检索范围未发现独立重载。客户端不读这些 INI。改权重后须重新绑定或刷新动态商店才抽新列表。
样本格式 GB18030-compatibleCRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。

怎样接到 ShopTable

ShopTable 列 对随机店的作用
第 13 列非 0 跳过表内 50 组商品,改读第 14 列 INI。
第 14 列路径 例如 ../Public/Config/RandShop/60wufang.ini,大小写按实际路径。
第 12 列 Num 抽出件数 nCountForSell,不是 INI 的 Total。
第 8 列货币 金币/交子仍用物品基础价;善恶值等用 INI 的 Value。

加载时按 [General] Total 读取 Merchandise0..Merchandise(Total-1)。随后 NPC 初始化若填写 shop0..shop3,会复制该店并按权重抽出 Num 件上架。只调用 DispatchShopItem 打开静态表、NPC 没有动态商店时,随机店货架标记全为未出售,结果是空店。

系列成员

文件 商店编号与货币 样本要点
Public/RandShop/60wufang.ini 商店 75,1 金币 Total 14,抽出 5,Odds;60 级武防图样池
Public/RandShop/70wufang.ini 商店 76,1 金币 Total 24,抽出 10,Odds;70 级武防图样池
Public/RandShop/80wufang.ini 商店 77,1 金币 Total 38,抽出 15,Odds;80 级武防图样池
Public/RandShop/90wufang.ini 商店 78,1 金币 Total 52,抽出 20,Odds;90 级武防图样池
Public/RandShop/100wufang.ini 商店 79,1 金币 Total 66,抽出 25,Odds;100 级武防图样池
Public/RandShop/randgemshop.ini 商店 101,1 金币 Total 20,抽出 5,Odds;随机宝石
Public/RandShop/dazaotu.ini 商店 103,1 金币 Total 80,抽出 5,Odds;打造图
Public/RandShop/shanedian.ini 商店 104,2 善恶值 Total 84,抽出 10,Odds;善恶值商品;购买用显式 Value
Public/RandShop/xunluozawu.ini 商店 105,1 金币 Total 21,抽出 5,混用;Merchandise0 为 odds,其余为 Odds
Public/RandShop/shide.ini 商店 106,2 善恶值 Total 9,抽出 5,odds;键名全小写;Total=9 但还有 Merchandise9
Public/RandShop/miaojiang_randgemshop.ini 商店 109,1 金币 Total 6,抽出 3,Odds;苗疆宝石,Rebate=7
Public/RandShop/qiongzhou_randgemshop.ini 商店 110,1 金币 Total 9,抽出 3,Odds;琼州宝石
Public/RandShop/huanglong_randgemshop.ini 商店 111,1 金币 Total 5,抽出 3,Odds;黄龙宝石,Rebate=7
Public/RandShop/shuhe_randgemshop.ini 商店 186,1 金币 Total 20,抽出 2,Odds;蜀河宝石
Public/RandShop/petskillshop.ini 商店 无,— Total 9,抽出 —,Odds;当前 ShopTable 未引用

文件格式

使用 [节名] 与 Key=Value,节名和键名区分大小写,保持节标题位于行首。用单独一行分号写注释,保留原编码及 CRLF 换行;重复节或键取先匹配项,不依赖后写覆盖。缺项、空值与 0 分别按下表处理。

字段详解

模板 [n] 表示从 0 开始的序号,写入时应展开为实际数字;不是字面键名。

[General]

字段与类型 含义与修改要点 缺项或特殊值
Total
整数,商品池条数
循环 0..Total-1 读取对应 Merchandise 节。样本须从 0 连续编号。超过 1024 先截成 1024,再按 BYTE 作为列表长度,256 会变成 0。 缺项断言失败。shide.ini 写 Total=9 却另有 Merchandise9,第 10 条不会加载。

[Merchandise[n]]

字段与类型 含义与修改要点 缺项或特殊值
ID
整数,物品模板编号
n 从 0 到 Total-1。须能在对应物品表查到。不是商店编号、GUID 或背包格。 缺项断言。0 会在后续类型解析中视为空物品。
CountPerUnit
整数,每单位件数
一次购买得到的件数。金币/交子计价再乘该件数。 缺项断言。小于 0 改为 1,大于 100 改为 100。
Count
整数,库存上限
加载后的有限库存。0 改为 -1 表示不按有限库存。 缺项断言。静态下发 MaxNumber 仍为 -1,有限库存主要在动态店。
Odds
字符串再转浮点,相对权重
键名必须是 Odds。抽选权重为 AppearRate×rand()。读不到则为 0。 大小写敏感。shide.ini 与 xunluozawu.ini 的 Merchandise0 写成 odds,当前读成 0。缺项不断言,权重为 0。
Value
整数,显式单价
善恶值等非金币/交子货币使用本值。金币/交子购买忽略它,改用物品基础价。 缺项断言。60wufang 的 1000 不会改金币价。
Rebate
整数,折扣分母
缺项或非正数按 100。BuyRate=100/Rebate,再参与售价。样本部分宝石店为 7。 不是百分比写法。0 或负数记日志后改回 100。

常用修改实例

示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。

把 60 级武防随机池第一件图样的出现权重从 1 改为 10

修改前:

[General]
Total=14
[Merchandise0]
ID=30300006
Count=1
CountPerUnit=1
Odds=1
Value=1000

修改后:

[General]
Total=14
[Merchandise0]
ID=30300006
Count=1
CountPerUnit=1
Odds=10
Value=1000

在完整 60wufang.ini 中定位 [Merchandise0],确认 ID=30300006(金顶枣阳槊图样)。只把 Odds=1 改成 Odds=10,保留 Count、CountPerUnit、Value、Total=14 以及 Merchandise1..13。键名必须是 Odds,不能写成 odds。本片段去掉了原行尾中文注释,编辑原文件时保留注释和编码。

该文件由 ShopTable 商店 75 引用,货币为金币,抽出数量 5。Odds 是相对权重,只有 NPC 绑定动态商店并执行抽选后才影响哪 5 件出现;金币购买仍用物品基础价 6000,不读 Value=1000。隔离加载确认该条 AppearRate 由 1 变为 10。实际窗口和每次刷新结果需要实测。

验证与排查

启动无 RandomShop 读取断言。商店 75 池 14 条、抽出 5,Merchandise0 的 Odds 为 10。NPC 须在场景初始化 shop0..shop3 绑定 75 后打开,确认图样仍在池中且权重变化。odds 小写不会生效。空店先查是否走了静态表而不是动态店。恢复 INI 与 ShopTable 后重启。

抽选

权重为 Odds×rand(),选出 Num 件。全为 0 时比较用严格大于,结果是池中前 Num 件。不能把单次刷新当成概率证明。

键名

节名、键名大小写必须与源码一致:General、Merchandise0、Odds、Rebate。IniFile 用 strncmp,odds 不等于 Odds。

未引用文件

petskillshop.ini 当前检索范围未发现 ShopTable 或其他启动路径引用。只有把第 14 列指过来才会加载。

打开接口仍是 DispatchShopItem,ShopId 是 ShopTable 第一列,不是 INI 文件名。

关联与依据

Public/ShopTable.txt · Public/ShopSceneLimiti.txt · Public/CommonItem.txt

其他配置及整理状态 · 服务端外网设置 · Lua 接口索引

  • Server/Server/GameServer/Server/Other/ShopManager.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Other/ShopManager.h:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Obj/Obj_Monster.cpp:实际加载、解析、字段使用或示例关联依据
  • Server/Server/GameServer/Server/Obj/MonsterManager.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/Ini.cpp:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/Ini.h:实际加载、解析、字段使用或示例关联依据
  • Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据
  • Common/GameDefine2.h:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/60wufang.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/70wufang.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/80wufang.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/90wufang.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/100wufang.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/randgemshop.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/dazaotu.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/shanedian.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/xunluozawu.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/shide.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/miaojiang_randgemshop.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/qiongzhou_randgemshop.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/huanglong_randgemshop.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/shuhe_randgemshop.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/RandShop/petskillshop.ini:实际加载、解析、字段使用或示例关联依据
  • resources/Public/Config/ShopTable.txt:实际加载、解析、字段使用或示例关联依据

原始 IniFile 与 LoadRandShopFromIni 隔离测试,覆盖 Total、Odds 大小写、缺 Rebate 与显式 Rebate。抽选、NPC 绑定和购买为源码核对;未启动游戏。