Files
bd2/GAME_CONFIGURATION.md
T
Flechazo d8771caef2 feat(all): add hunting and events, commerce and rewards, binary calendars, GameData caching and login diagnostics
Implement hunting AP and progress, event tasks, exchanges, games, stories and actions; connect battle and reward handling.

Add CashShop plugin and installation, server purchases and entitlements, recharge rules and plugin version metadata.

Distribute binary calendars independently; cache GameData in memory and fix single-connection query deadlocks.

Improve automatic login and recovery diagnostics; document configuration and release flows.
2026-10-05 11:50:31 +08:00

5.8 KiB
Raw Blame History

服务端游戏规则配置

game.json 是服务端统一的游戏规则配置入口。后续可配置的游戏规则在此按功能分组扩展;认证、资源源、版本清单仍分别使用现有配置文件。

发布部署时,将文件放在 bd2server.exe(Linux/macOS 为 bd2server)旁。开发入口读取仓库根目录的同名文件。可修改的规则在重启后生效,起始章节只在首次初始化时选择。客户端无需配置此文件。发布包只在服务端包中提供 game.json 和本指南。

默认内容:

{
  "schema_version": 1,
  "story": {
    "start_pack_id": 21
  },
  "gacha": {
    "include_collaboration_ur_weapons": false
  },
  "purchases": {
    "diamond_recharge": {
      "currency": "free",
      "gold_per_paid_diamond": 1000,
      "diamonds_per_paid_diamond": 1
    }
  }
}

联动 UR 专武

gacha.include_collaboration_ur_weapons 必须是 JSON 布尔值:

值 UR 必得装备券的结果
false(默认) 使用当前 GameData 的原始 UR 必得装备券池。
true 在原池中加入 14 种联动角色 UR 专武(装备 ID 943200 至 943213)。

开关仅作用于 UR 必得装备券。新增装备沿用同星级原有装备的单件权重,原有星级权重规则保持不变;加入候选后,同星级内的概率按扩展后的权重总和计算。该设置只改变券池候选,不会直接发放装备。专武绑定角色,同一角色的多个服装共用专武。

服务器的起始章节

story.start_pack_id 接受整数 21 或 1,省略时默认 21。

值 本服玩家的开局
21(默认) 从当前客户端默认的店长篇开始,使用该篇的任务和教学流程。
1 从旧主线第一章开始,使用当前 GameData 中该章的开场剧情、初始任务及购卡奖励。

请在服务器首次启动前确定此值。第一次成功初始化时,服务端会在 SQLite 中持久保存服务器的起始章节;此后配置必须与保存值一致。改成另一个章节会拒绝启动,并在日志中明确提示原值与配置值,不会覆盖原设置或玩家进度。首次启动失败并回滚时不会锁定选择,可以修正配置后重试。

这项限制只针对 story.start_pack_id;其他游戏规则仍可修改。升级和恢复服务器时应一起保留配置与数据库,不能通过删除数据库来切换开局,这会删除玩家存档。

后续官方若将旧主线与店长篇重构合并为一条剧情线,再重新评估此限制与迁移方案。重构发布日期尚未确认。

现金商品与付费钻石充值

所有原本走平台现金支付的普通商品,包括礼包、皮肤、通行证与付费抽卡商品,都固定消耗付费钻石。这类商品没有免费购买配置开关;purchases.diamond_recharge 仅设置付费钻石充值的兑换方式。原本已使用游戏内货币的商品仍走原来的游戏内购买流程。

普通现金商品的价格由当前版本 GameData 计算:取最小常规充值档位的现金标价与付费钻石数量作为换算基准,将商品现金标价换算为付费钻石并向上取整。当前 2.35.10 的最小档位为现金标价 2200、常规付费钻石 100,因此普通商品价格为 ceil(现金标价 / 22)。运行时读取 GameData 的实际档位,不把该比值固定写入代码。首次充值的加倍奖励不参与换算基准,也不增加充值兑换费用。

purchases.diamond_recharge.currency 接受下列值:

值 付费钻石充值行为
"free"(默认) 不扣货币,发放所选充值商品的原始奖励。
"gold" 每单位常规付费钻石消耗 gold_per_paid_diamond 金币。
"diamonds" 每单位常规付费钻石消耗 diamonds_per_paid_diamond 普通钻石。
"ban" 或 "" 禁止购买付费钻石充值商品。

省略该配置分组或 currency 时使用 "free";显式写空字符串 "" 会禁止充值。null 仍属于无效配置。兑换倍率必须是 1 到 1000000000 之间的整数,默认分别为 1000 金币与 1 普通钻石。即使选中其他兑换方式,两个倍率也必须合法。配置导致任何实际商品单次费用超出游戏钱包支持的整数范围时,服务端拒绝加载该商品目录;多件购买超过范围时拒绝该次购买。

例如,使用金币兑换充值:

"purchases": {
  "diamond_recharge": {
    "currency": "gold",
    "gold_per_paid_diamond": 1000,
    "diamonds_per_paid_diamond": 1
  }
}

充值的兑换费用按常规充值数量计算,实际发放仍遵守所选商品的奖励和首购限制。因此常规数量为 100 的首购加倍商品在默认金币倍率下扣 100000 金币,保留原来的加倍奖励;后续常规商品扣相同费用。禁止充值不会免费化其他现金商品,也不会删除玩家已有的付费钻石。

客户端从服务端 /client/commerce 获取商品价格目录。商品由 group_id、product_id、sale_group 三元组识别,Google 与 Apple 平台商品编号均作为别名返回;同一平台编号对应首购与常规变体时仍保留不同商品键。显示价格和购买校验使用同一服务端规则。

校验与升级

schema_version 当前必须为 1。字段拼写错误、未知字段、错误类型(例如字符串 "true")、null、格式错误或文件末尾多出的 JSON 都会使服务端拒绝启动,并在错误中给出文件路径。省略 gacha 或此布尔开关时使用 false。

旧安装缺少整个文件时使用默认规则,服务端不会自动写入或覆盖文件。升级服务端时保留服主已经修改的 game.json;新发布包中的文件可用于比对新增字段。Docker 部署可将自定义文件只读挂载到 /app/game.json,重启容器后生效。