工程参考/配置文件/Public/Condition.txt
Condition.txt 是城市玩法的条件表。建筑升级与研究项目都通过编号引用这里的一行;判定通过后会按本行扣除帮派资金与帮派属性,并把任务数当作研究进度条的上限。样本 79 行、7 列。
它只描述「要花什么、要先有什么」,不描述升级后得到什么——那部分在 CityBuilding.txt 与 ResearchItem.txt。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ../Public/Config/Condition.txt,路径写死在加载函数里,相对于 World 工作目录。当前检索没有发现客户端注册本表,改它不需要同步客户端。
|
| 读取程序 | World 进程:TableInit::Init_ConditionTable 用 DBCFile::OpenFromTXT 打开 "../Public/Config/Condition.txt" |
| 生效方法 | 正常保存并停 World 后重启 World。当前检索未发现单独重载本文件的可用入口。 |
| 样本格式 | GB18030-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
服务端 Init_ConditionTable 逐行读第 2 到第 7 列(0 基 1 到 6),第 1 列只用于建立 DBC 索引,代码不读它。引用方统一用 g_ConditionTbl.m_Table[ConditionIndex - 1],所以编号是 1 起的行号。
判定逻辑集中在 BuildingCore.cpp:{| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 步骤 ! scope="col" style="width:76%;text-align:left;background:#edf3f2;padding:8px;" | 行为 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 建筑等级前置 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 需求建筑类型不为 -1 时,取该类型建筑的当前等级,要求 >= 需求级别 - 1。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 帮派属性 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 消耗属性类型不为 -1 时,要求对应帮派属性 >= 消耗属性值。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 帮派资金 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 帮派资金列不为 -1 时,要求帮派资金 >= 该值。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 扣除 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 判定通过且传入扣除标志时,按消耗属性值扣帮派属性、按帮派资金列扣资金。 |}
这里用 -1(INVALID_ID)表示「不检查 / 不扣除」,不是 0。研究进度上限直接取任务数列:m_iMaxProgress = m_MissionNum。
文件格式
首行是类型行:INT INT INT INT INT INT INT;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。
字段详解
列号从 1 开始,源码列下标从 0 开始。
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
第 1 列INT:ID |
条件编号,同时是 DBC 索引列。引用方按 m_Table[ConditionIndex - 1] 取用,因此这一列必须等于行号(1 起)。ResearchItem.txt 的条件列与 CityBuilding.txt 的 LevelRequire 列都指向它。
|
必须唯一且非空;重复触发 DBC 重复索引错误,空首列使整行被跳过。 |
第 2 列INT:帮派资金 |
需要的帮派资金下限,判定通过后会按这个数值从帮派资金里扣除。 | 填 -1 表示既不检查也不扣除;填 0 表示只检查(资金必然满足)且扣 0。加载时断言非负,所以 -1 之外不能填其它负数。 |
第 3 列INT:任务数 |
研究进度条的上限,研究发起时直接写进 m_iMaxProgress。 | 加载时断言非负;填 0 会让进度条一发起就满。 |
第 4 列INT:消耗属性类型 |
要检查并扣除的帮派属性,取自 GUILD_ATTR_TYPE:0 工业、1 农业、2 商业、3 国防、4 科技、5 环境。 | 填 -1 表示不检查也不扣属性。加载时断言落在 0 到 5,超出会断言失败。 |
第 5 列INT:消耗属性值 |
对应帮派属性需要达到的下限,判定通过后按这个数值扣除。 | 配合第 4 列使用;第 4 列为 -1 时本列不参与判定。 |
第 6 列INT:需求建筑类型 |
前置建筑类型,取自 BUILDING_TYPE:0 县衙、1 厢房、2 酒肆、3 钱庄、4 防具、5 锻台、6 武具、7 米仓、8 城墙、9 集仿、10 医舍、11 武仿、12 箭塔、13 书房、14 奇迹、15 校场、16 火冰塔、17 大旗,最大 17。 | 填 -1 表示没有建筑前置。加载时断言落在 -1 到 BUILDING_MAX-1。 |
第 7 列INT:需求级别 |
前置建筑需要达到的等级。判定式是「建筑当前等级 >= 需求级别 - 1」,因此填 1 表示建筑只要存在(0 级)即可。 | 填 -1 时判定式变成「当前等级 >= -2」,实际等同于不限制。加载时断言 >= -1。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。
把 1 号条件的帮派资金要求从 10000 提高到 12000
修改前:
INT INT INT INT INT INT INT ID 帮派资金 任务数 消耗属性类型 消耗属性值 需求建筑类型 需求级别 1 10000 5 5 0 1 1
修改后:
INT INT INT INT INT INT INT ID 帮派资金 任务数 消耗属性类型 消耗属性值 需求建筑类型 需求级别 1 12000 5 5 0 1 1
按第 1 列定位 1 号条件。原本要求帮派资金 10000、任务数 5、消耗属性类型 5(环境)、消耗属性值 0、需求建筑类型 1(厢房)、需求级别 1。这里只把第 2 列改成 12000,其余 6 列全部保留。
改这一列会同时抬高「检查门槛」和「扣除金额」,因为判定与扣除用的是同一个值。只想抬高门槛而不想多扣,需要另建一行条件并让引用方改指过去。
示例块含类型行、列名行与该行原文,不能覆盖整表。改完需要重启 World。
验证与排查
World 启动日志里 Init_ConditionTable 会打印 “Load Condition.txt ... OK!”;消耗属性类型超出 0 到 5、需求建筑类型超出 -1 到 17、或资金与任务数为负都会断言。改动后重启 World,分别在帮派资金不足 / 属性不足 / 前置建筑等级不足的情况下尝试升级与研究,预期失败并能在帮派日志里看到对应的 ConditionTest 记录;再在条件满足时确认扣除金额与进度条上限正确。失败时恢复备份并重启。
编号是 1 起的行号
引用方一律 m_Table[ConditionIndex - 1],编号必须落在 1 到行数(上限 MAX_CONDITION = 512)之间。只改第 1 列而不挪行会让所有引用错位。
-1 才是「不检查」
帮派资金、消耗属性类型、需求建筑类型三列都用 -1(INVALID_ID)表示跳过该项检查,不是 0。填 0 会真的去做一次「>= 0」的比较并扣 0。
需求级别的判定要减一
RequiredLevel < Condition.m_RequireBuildingLevel - 1 才判失败,也就是「当前等级 >= 需求级别 - 1」通过。填 1 表示 0 级建筑即可,填 5 要求建筑已到 4 级。
判定与扣除用同一个值
帮派资金与消耗属性值既当下限又当扣除量,没有单独的「扣除量」列。想分离就要新建一行条件。
当前只有服务端读取
本页检索到的加载与消费都在 World 侧;没有发现客户端注册或读取 Condition.txt,改它不需要同步客户端资源。
关联与依据
Public/ResearchItem.txt · Public/CityBuilding.txt
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据Server/Server/WorldServer/World/Main/WorldTable.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/WorldServer/World/Main/WorldTable.h:实际加载、解析、字段使用或示例关联依据Common/GameDefine_City.h:实际加载、解析、字段使用或示例关联依据Server/Server/WorldServer/World/WorldData/City.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/WorldServer/World/WorldData/IBuilding.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/WorldServer/World/WorldData/BuildingCore.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/WorldServer/World/WorldData/exe/ExeCityResearchLevelUp.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/WorldServer/World/WorldData/exe/ExeCityBuildingLevelUp.cpp:实际加载、解析、字段使用或示例关联依据Common/GameDefine_Guild.h:实际加载、解析、字段使用或示例关联依据resources/Public/Config/Condition.txt:实际加载、解析、字段使用或示例关联依据
本页核对 Init_ConditionTable 的 0 基列号与六个字段的断言范围、BuildingCore::ConditionTest 与 CanLevelUp 的判定与扣除流程(含「等级 - 1」的比较式与 INVALID_ID 跳过语义)、ExeCityResearchLevelUp 里 m_MissionNum 作为进度上限的用法,以及 GUILD_ATTR_TYPE 与 BUILDING_TYPE 两个枚举的取值范围;未启动服务端与游戏,实际升级与研究的扣费表现需要实测。