Files
metin2-client/tools/server/biolog
..

AVA2 生物学家系统

本实现已替代最初的 collect_quest 远程窗口。任务状态使用 AVA2 的 bio.level、bio.count、bio.time 和 bio.bonusN;不迁移旧角色。

依据与规则

  • 原始逻辑:build/ava2-comparison/server/game/src/constants.cpp、cmd_general.cpp::do_bio、char.cpp::CheckBio;原始客户端 AVA2/1. Client DEV/pack_maker/root/uibiyolog.py。
  • import_ava2.py 提取 13 阶段表和 do_bio 主体,输出 ava2_biolog_core.h、catalog.json、reference.json。保留算法与状态变更顺序,仅适配分词、消息本地化和当前协议中的点数编号。
  • 阶段为 30/40/50/60/70/80/85/90/92/94/98/100/105。基础成功率全部 60%;等待时间分别为 600/600/900/900/1800/1800/2700/3600/7200/7200/10800/10800/10800 秒。
  • 材料、数量、任务石、全部奖励值及是否选择奖励,均取原表。最后一份材料成功后进入任务石阶段;交石后自动发放全部固定奖励,或等待玩家选择一个奖励。没有原版额外宝箱。
  • 精华 71035 提高本次成功率 50 个百分点(60+50,必定成功);开启但未持有时沿用基础概率。冷却药剂 30250 只在仍处于冷却且选择跳过时消耗。提交失败也扣材料并开始下一次冷却,保持 AVA2 行为。
  • 默认开启精华、跳过冷却、到期提醒,按角色保存偏好。奖励在窗口直接选择;70028 从背包使用打开重选界面,重选消耗一份并只替换对应阶段的已选奖励。

实现

src/platform/ScriptLib/BiologScript.inc 通过 PythonBoot 注入 mt_biolog,界面适配鼠标和触摸,使用原有 biodata、biostone、bioodul、bioempty 消息。

服务端 biolog_remote.h 提供 /bio status、mission <精华0/1> <跳过0/1>、gift <0起选项>;增加 scoped 的 buy <商品索引> 和 reset <阶段索引> <选项> 以适配当前客户端协议。原 /biolog status 仅作查询别名,旧 act 不再执行。

原 do_bio 中伪造的空奖励选项可能让任务前进却不发奖。适配层拒绝非法选项、溢出的布尔值和额外参数;交易、仓库、商店、任务协程、死亡、传送期间不能变更研究状态。合法请求与 AVA2 对照验证。

属性实际效果

patch_points.py 增加 POINT_ATTBONUS_STONE=240、POINT_ATTBONUS_BOSS=241、POINT_RESIST_HUMAN=220;保留原 255 点数据包大小。PointChange、持久化 AFFECT_COLLECT 和实际 CalcAttBonus 均接入这些属性。

陨石/Boss 伤害的插入顺序和半人抗性的 PvP/NPC 算法取 AVA2;研究给予的怪物加成按 AVA2 排除 Boss。当前服务器原有非研究装备属性保持原规则。近战/魔法加成 132 已有实际效果。

商店及资源

shop.json / ava2_biolog_shop.h 来自 AVA2 MYSQL56 的 shop=8、shop_item 表:13 颗任务石按原金币价格出售,9 种后期材料按原指定材料数量兑换,共 22 项。当前服务器原 shop=8 为烟花店,保持它不变;新 UI 的研究商店使用独立命令,沿用 AVA2 的支付及发物顺序。

make_assets.py 从 AVA2 home/srv1/db/item_proto.txt 和解包客户端提取 29 个研究相关物品定义、图标和物品列表,输出当前 156 字节格式 proto 和小型 biolog.eix/.epk。名称/描述为中文。tests/port/biolog_proto_patch.cpp 对其他物品记录不做变更,并校验编码回读。

资源包必须作为当前 Client/pack/Index 的首个条目:

PACK
*
biolog
...原有条目...

Android APK 不包含完整游戏资源;必须同时更新 biolog.eix、biolog.epk 与 Index。正常使用 android/push-client.sh --locale zh 同步即可。商店所用兑换货币在当前服已有物品定义;没有把 AVA2 的其他地图、世界 Boss 或全服掉落系统一并替换。

构建、部署和回滚

  1. python3 import_ava2.py AVA2_GAME_SOURCE OUTPUT,核对 reference.json;生成的主体不手改。
  2. 使用 make_assets.py 准备物品和补丁包。生成命令/输入参数见脚本。
  3. 备份当前源码,在服务器执行 prepare_source.py GAME_SRC STAGE、patch_points.py GAME_SRC,隔离输出 gmake -j2 GAMEDIR=BUILD_DIR。char.h 变化需要重编依赖。
  4. 在隔离目录用当前 qc 编译 port_bio_reset.quest。
  5. sh deploy_ava2.sh BUILD_DIR。先等待所有 game cores 正常保存退出,再停 db/auth;备份原 game、物品表、旧任务对象,加载新增物品后重启服务。

install_ava2_data.py 将 455 个旧 collect_quest_lv*、collect_quest_reset 事件移到备份目录,避免两个研究系统同时生效;原始任务源文件与现有角色数据库未批量修改。

2026-10-14 已部署到 203:独立构建 /root/biolog-ava2-build-20261014,回滚备份 /root/backup-biolog-ava2/20261015-030954(服务器时区)。源码修改前备份在构建目录的 source-backup。

回滚需停 game/db/auth,恢复备份 game、data/item_proto.txt、data/item_names.txt 和 data/legacy-objects.json 中的任务文件;移除 port_bio_reset 对象,再启动服务。部署前 source-backup 可恢复源码。新系统不继承 collect_quest 的 flag;不对旧角色已存在的历史属性做清除。

验证

  • tests/test_ava2.py AVA2_GAME_SOURCE:6,674 组原始 do_bio 与适配入口对照,涵盖 13 阶段、概率边界、材料/石头、冷却、辅助道具、固定/选择奖励累计;验证重复领奖、非法参数、22 项商店和奖励重选。
  • tests/test_combat.py PATCHED_BATTLE_CPP:编译实际 CalcAttBonus,检查陨石/Boss 加成、研究怪物加成排除 Boss、半人抗性。
  • port.login_flow:桌面与触摸均通过,包含真实点击入口、消息处理、重复点击拦截、冷却、各阶段奖励选项显示。
  • 专用角色联机 initial/aux/gift4/gift13/shop:真实扣材料、精华必成、冷却药剂消耗、石头转选奖、点数 240 生效、最终完成、兑换扣料均通过。重登和背包使用重选道具另有 resume/reset 模式。
  • 日志、资源生成记录及截图在忽略的 build/biolog-ava2-validation/。离线截图使用演示数据;未自动安装到 Android 真机。

最终验收补充:70028 的 ITEM_QUEST 类型、堆叠与数值也按 AVA2 导入(因此总计 29 个模板)。 第二次物品备份 /root/backup-biolog-ava2/20261015-031709,完成角色奖励列表补充的 game 备份 /root/backup-biolog-ava2-game/20261015-032329。 常规 scripts/build_zh_locale.py 已自动生成并注册 biolog 补丁;Android 同步摘要纳入其配置及生成器。 Mac 本地签名包已校验并从独立 bundle 资源完成渲染启动检查;Android 更新 ZIP 包含 APK、三份资源文件及同步脚本。 最终联机 resume/reset/complete 均通过,覆盖从背包使用 70028、不提前扣券、只替换所选奖励、完成全部研究后重登保留选择记录。五个专用测试账号已设为 BLOCK,临时 AVA2 MyISAM 参考数据库已移除。两个 ZIP 均完成 CRC 校验,Mac bundle 签名校验通过。