Files
ImmortalSect/doc/弟子属性.md
T

125 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 弟子属性设计
本文件定义弟子(Disciple)的属性体系、境界规则与派生逻辑,是 `src/Data/Models/Disciple.gd` 的实现依据。关联:`doc/弟子管理.md`(模块设计)、`doc/模块联动.md`(联动规范)、`doc/Roadmap.md`P1 核心循环)。
## 1. 属性列表(权威定义)
| 名称 | 范围 | 说明 |
|:---|:---|:---|
| metal | [0, 100] | 金属性值 |
| wood | [0, 100] | 木属性值 |
| water | [0, 100] | 水属性值 |
| fire | [0, 100] | 火属性值 |
| earth | [0, 100] | 土属性值 |
| efficiency | [1, 100] | 灵气吸收效率,决定修炼速度,隐藏属性 |
| realm_level | [0, 5] | 大境界,凡人、练气、筑基、金丹、元婴、化神 |
| sub_realm_level | [1, 13] | 凡人只有一个小境界;练气 13 个小境界,其他各有前、中、后、大圆满四个小境界 |
| cultivation_exp | [0, 2147483647] | 修炼经验 |
| farming_exp | [0, 2147483647] | 耕作技能经验 |
| farming_level | [0, 10] | 耕作技能等级 |
| herb_exp | [0, 2147483647] | 药草耕作技能经验 |
| herb_level | [0, 10] | 药草耕作技能等级 |
| alchemy_exp | [0, 2147483647] | 炼丹技能经验 |
| alchemy_level | [0, 10] | 炼丹技能等级 |
| loyalty | [0, 100] | 忠诚度 |
> 字段说明:`id` 只读,由管理器分配;`name` 普通字符串。原设计中的 `is_mortal`、`cultivation_skill`、`alchemy_skill` 单值字段由下述规则取代,不单独存字段。
## 2. 境界体系
大境界 `realm_level` 与显示名、小境界 `sub_realm_level` 数量:
| realm | 名称 | sub 范围 | 小境界显示 |
| --- | --- | --- | --- |
| 0 | 凡人 | 固定 1 | 凡人 |
| 1 | 练气 | 1~13 | 练气X层(1~13 层) |
| 2 | 筑基 | 1~4 | 筑基前期 / 中期 / 后期 / 大圆满 |
| 3 | 金丹 | 1~4 | 金丹前期 / 中期 / 后期 / 大圆满 |
| 4 | 元婴 | 1~4 | 元婴前期 / 中期 / 后期 / 大圆满 |
| 5 | 化神 | 1~4 | 化神前期 / 中期 / 后期 / 大圆满 |
## 3. 灵根(五行推导,不存字段)
有灵根的凡人才能修炼破境。**任一五行属性 ≥ 阈值(占位 20,待调参)即具灵根**:
- 有灵根 → 可修炼:凡人期积累修炼经验,满后破境入练气
- 无灵根 → 终生为凡,永不涨修炼经验(且大境界 0)
派生:`has_spiritual_root()`;凡俗判定 `is_mortal() = (realm_level == 0) 且 无灵根`
## 4. 经验规则
### 4.1 修炼经验(cultivation_exp
- 每个小境界有经验上限(曲线表配置,见 §5)
- **跨小境界**:经验满自动突破 sub+1,溢出部分**继承**到下一个小境界
- **跨大境界**:sub 到顶(练气 13 / 其他 4)再满,realm+1 且 sub=1,溢出部分**清零**
- 化神大圆满封顶,不再获得修炼经验
- 突破自动进行(回合结算时处理),暂不设额外条件
### 4.2 技能经验(farming / herb_farming / alchemy 三套相同规则)
- 每跨一级,溢出的经验**继承**到下一级,直到升满(10 级)为止
- 满级后继续获得的经验**不再累积**(经验不会提升)
- 每个等级所需经验由配置文件给出(曲线表,见 §5)
### 4.3 效率的作用
`efficiency` 决定修炼速度(隐藏属性),不直接改变经验上限;具体月收益公式由管理器结算实现,数值待调参。
## 5. 经验曲线表(放 Disciple.gd 内部 const,占位待调参)
> 存储决策:曲线表先以常量写在 `Disciple.gd` 内部,自包含易调;静态内容层方案(CSV/Resource)落地后再迁移。
### 5.1 修炼曲线 CULTIVATION_EXP_CAPS
键为 `"{realm}_{sub}"`,共 30 条(凡人 1 + 练气 13 + 筑基/金丹/元婴/化神 各 4)。凡人期条目(`0_1`)供有灵根凡人积累经验破境用;化神大圆满(`5_4`)无上限(哨兵)。
```
{"0_1": 100, "1_1": 100, "1_2": 110, ... 占位递增,待调参}
```
### 5.2 技能曲线 SKILL_EXP_CAPS
10 条,表示 level N → N+1 所需经验(N = 0~9)。三套技能暂共用一张表,将来可拆分。
```
[100, 120, 140, ...] 占位,待调参
```
## 6. 读写与派生接口(数据类 API)
数值属性读写统一走键名接口(RANGES 为合法键与夹取范围的唯一权威):
```gdscript
func has_attr(key: String) -> bool # key 是否为登记表中的数值属性
func get_attr(key: String) -> int # 读数值属性(未知键 push_error 返回 0
func set_attr(key: String, value: int) -> bool # 写数值属性(夹取 + 境界/小境界联动约束)
```
> 说明:`id` 只读语义(由 `create()` 分配),`name` 为字符串不入 RANGES;两者直接字段访问。`total_amount` 为只读属性(实时由五行之和计算)。
派生只读方法(境界体系相关,实现时见 §2):
| 方法 | 逻辑 |
| --- | --- |
| `total_amount`(只读属性) | 五行之和(实时派生) |
| `has_spiritual_root() -> bool` | 任一五行 ≥ 灵根阈值 |
| `can_cultivate() -> bool` | 有灵根 且 未满级 |
| `is_mortal() -> bool` | realm 0 且无灵根 |
| `sub_realm_max() -> int` | 当前大境界的小境界上限(查 SUB_MAX_BY_REALM |
| `exp_cap() -> int` | 当前 (realm, sub) 修炼经验上限(查曲线);满级返哨兵 |
| `realm_name() -> String` | 完整显示名:凡人 / 练气5层 / 筑基后期 / 化神大圆满 |
> 状态迁移(突破、升级、经验增减)属领域操作,归 DiscipleManager(见 `doc/弟子管理.md`),数据类只提供纯查询。
## 7. 夹取与写入约束
- `RANGES` 常量表为 17 个属性的合法范围唯一权威,`create()` 与管理器 `set_attr()` 共用
- 属性全部普通字段(每属性 1 行声明),不带 setter 样板;夹取收口在两处写入口
- 直接写字段不夹取,依赖 `doc/弟子管理.md` "修改只走管理器"纪律
## 8. 变更记录
- 2026-09-07:确立属性列表、境界体系(0~5 + sub)、灵根五行推导、经验曲线表结构;本文档由与 opencode 的讨论结论整理(本文件前身为占位草稿)