Files
abot/plugins/xiuxian/README.md
2025-11-18 16:23:30 +08:00

447 lines
20 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.
好的,我将把我们讨论过的**所有细节**包括灵根类型、双轨制突破、所有保护机制、数据库设计、Redis 方案和防封策略,全部汇总成一份详尽的、可直接用于开发的 Markdown 研发文档。
-----
# 🚀 (终稿) 群聊文字修仙Bot - 综合研发文档
## 1\. 核心设计原则
本项目旨在实现一个功能完整、可玩性高、同时严格遵守平台规则的文字修仙 Bot。
1. **简化交互 (防封/防骚扰):** 杜绝一切“问答式”或“多步骤”指令。所有指令都必须是原子操作(一次性完成)。通过强制冷却 (Cooldown) 和清晰的玩家状态机来防止刷屏和恶意PVP。
2. **高性能:** 核心热数据(玩家状态、排行榜)必须由 Redis 管理,数据库 (MariaDB) 仅作为持久化存储。
3. **策略深度:** 玩家有明确的“策略分支”,例如【丹药 vs 强行】突破【PVE vs PVP】资源获取【灵根天赋】带来的个体差异。
好的,道友。修行之路漫漫,境界划分乃是天道之基石。
这里为你拟定一份详尽的、以“每阶10层”为基础的修炼级别体系。此体系平衡了前期“凡人”到“修士”的过渡以及中后期“成仙”的漫长道路。
---
### 凡人篇 (Mortal Phase)
* **凡人 (Mortal)**
* (无层级之分,尚未感应灵气)
### 人仙篇 (Human Immortal Path)
#### 第 1 境:练气 (Lianqi / Qi Refining)
* *描述:* 感应灵气,引气入体,淬炼肉身,开辟丹田。此为修行之始。
* *层级:* **练气 1 层 ~ 练气 10 层 (大圆满)**
* *瓶颈:* 10层大圆满后需冲击 **筑基** 瓶颈。
#### 第 2 境:筑基 (Zhuji / Foundation Establishment)
* *描述:* 灵气化液,在丹田内筑下道基。神识诞生,寿命大涨。
* *层级:* **筑基 1 层 ~ 筑基 10 层 (大圆满)**
* *瓶颈:* 10层大圆满后需碎丹田道基凝结 **金丹**
#### 第 3 境:金丹 (Jindan / Golden Core)
* *描述:* 灵液归一,结成金丹。丹成无悔,自此踏入修仙坦途,可御空飞行。
* *层级:* **金丹 1 层 ~ 金丹 10 层 (大圆满)**
* *瓶颈:* 10层大圆满后需碎丹使丹中“真灵”化为 **元婴**
#### 第 4 境:元婴 (Yuanying / Nascent Soul)
* *描述:* 金丹破碎,元婴出世。元婴为修士“第二性命”,可神魂出窍,夺舍重生。
* *层级:* **元婴 1 层 ~ 元婴 10 层 (大圆满)**
* *瓶颈:* 10层大圆满后需元婴与神魂合一领悟天地法则是为 **化神**
#### 第 5 境:化神 (Huashang / Spirit Transformation)
* *描述:* 神游太虚,领悟法则。元神合一,开始真正掌控天地灵气,法力无边。
* *层级:* **化神 1 层 ~ 化神 10 层 (大圆满)**
* *瓶颈:* 10层大圆满后需元神与肉身彻底融合**合体** 之境。
---
### 地仙篇 (Earthly Immortal Path)
*(后续境界通常更为艰难,可作为游戏的后期内容)*
#### 第 6 境:合体 (Heti / Integration)
* *描述:* 元神与肉身完美融合,不分彼此。举手投足引动天地之力,肉身不朽。
* *层级:* **合体 1 层 ~ 合体 10 层 (大圆满)**
#### 第 7 境:大乘 (Dacheng / Mahayana)
* *描述:* 法则大成,法力无边,已是人界巅峰。开始为飞升仙界做最后准备,积累底蕴。
* *层级:* **大乘 1 层 ~ 大乘 10 层 (大圆满)**
#### 第 8 境:渡劫 (Dujie / Tribulation)
* *描述:* 积累圆满,引动天劫(雷劫、心魔劫等)。此为成仙最后一道门槛,九死一生。
* *层级:* **渡劫 1 层 ~ 渡劫 10 层 (大圆满)**
*(注:此处 10 层可理解为承受“十重天劫”,或积累底蕴的十个阶段)*
### 真仙 (True Immortal)
* *描述:* 成功渡过天劫,飞升上界。
* *(游戏终点或新篇章起点)*
---
## 📖 玩家用户手册(如何玩)
### 快速开始
- 注册角色:发送 `注册修仙 道号`
- 查看状态:发送 `我的状态`
- 开始修炼:发送 `闭关`(进入闭关状态,安全不可被劫掠)
- 结束修炼:适时发送 `出关`(获得修为,进入“气息不稳”短暂状态)
- 聚灵提升:发送 `聚灵 数量`(消耗灵石,提升修为)
- 查看帮助:发送 `修仙帮助`(或 `帮助``help``修仙指令``指令`
### 日常玩法
- 签到领石:`修仙签到`(每日一次,获得灵石)
- 坊市购物:
- 查看商品:`坊市`
- 购买物品:`购买 物品名称 数量`
- 查看背包:`乾坤袋`
- 积分兑换灵石:`积分购石 积分数`
- 比例:`10 积分 = 1 灵石`
- 示例:`积分购石 100` → 获得 `10` 灵石
### 境界与修炼
- 境界层数:每个境界均为 110 层,达到 `10 层`为瓶颈(如 `炼气10层`
- 自动层提升:修为达到阈值自动提升层数(不跨瓶颈)。不同境界阈值不同:
- 炼气:每层约需 `1000` 修为
- 筑基:每层约需 `5000` 修为
- 金丹:每层约需 `50000` 修为
- 突破瓶颈:当到达 `当前境界10层` 可发起突破:
- 丹药突破:`突破`(需丹药,如 `筑基丹`,成功率较高、修为消耗较低)
- 强行突破:`强行突破`(不需丹药,成功率较低、修为消耗较高)
- 成功则进入下一境界;失败则保留当前境界与修为变动
### 门派系统
- 创建门派:`创建门派 名称``元婴期及以上`
- 加入门派:`加入门派 名称`
- 退出门派:`退出门派`
- 同门规则:仅同门可 `赠与 灵石``赠送 物品`;不可劫掠同门
### PVP 劫掠
- 发起劫掠:`劫掠 目标wxid`
- 限制与保护:
- 新手保护:`炼气期`目标不可劫掠
- 状态保护:`闭关``受伤保护`中不可被劫掠
- 群限制:仅限同一群内劫掠
- 门派限制:不可劫掠同门
- 结果:成功夺取对方约 `20%` 灵石,对方进入 `受伤保护`;失败无收益
### 排行榜
- 修为榜:`排行榜`Top10可能开启境界分值榜按境界映射分加层数
### 冷却与撤回
- 指令独立冷却(如 `闭关/出关≈5s``聚灵≈30s``突破≈60s`
- 消息自动撤回:错误提示≈`5s`,成功提示≈`10s`,列表展示≈`2030s`
### 常用示例
- 注册:`注册修仙 张三`;状态:`我的状态`
- 闭关/出关:`闭关``出关`
- 聚灵:`聚灵 10`
- 坊市:`坊市``购买 筑基丹 1``乾坤袋`
- 积分换石:`积分购石 100`(得 10 灵石)
- 突破:`突破`(需 `筑基丹`)或 `强行突破`
- 赠与:`赠与 @wxid_xxx 50`;赠送:`赠送 @wxid_xxx 筑基丹 1`
- 劫掠:`劫掠 @wxid_xxx`
- 门派:`创建门派 凌霄阁``加入门派 凌霄阁``退出门派`
- 排行:`排行榜`
### 常见问题
- “未注册”:先发送 `注册修仙 道号`
- “命令格式错误”:参考 `修仙帮助` 用法提示
- 积分不足/灵石不足:指令会提示当前剩余或不足原因
- 未到瓶颈:请先提升到 `当前境界10层`
- 强行突破失败:属正常设定,建议用丹药或补足修为
## 2\. 🛠️ 技术栈
| 类别 | 技术 | 备注 |
| :--- | :--- | :--- |
| 语言 | **Python 3.10+** | 异步 (asyncio) |
| Bot框架 | **NoneBot2** / **python-telegram-bot** | |
| 数据库 | **MariaDB 10.5+** | (InnoDB, utf8mb4) |
| ORM | **SQLAlchemy 2.0 (Async)** | |
| 缓存/限流 | **Redis** | 性能与防封的核心 |
## 3\. 💾 数据库设计 (MariaDB)
### 表 1: `t_xiuxian_player` (玩家核心表)
```sql
CREATE TABLE t_xiuxian_player (
-- 核心ID
user_id VARCHAR(100) NOT NULL COMMENT '平台用户ID',
group_id VARCHAR(100) NOT NULL COMMENT '主要所在群ID',
-- 基础信息
dao_name VARCHAR(100) NOT NULL COMMENT '道号',
realm VARCHAR(50) DEFAULT '凡人' COMMENT '境界 (如: 炼气1层, 筑基2层)',
spirit_root VARCHAR(50) DEFAULT '凡灵根' COMMENT '灵根天赋',
clan_id BIGINT DEFAULT NULL COMMENT '所属门派ID (外键)',
-- 资源
cultivation_points BIGINT DEFAULT 0 COMMENT '修为',
spirit_stone BIGINT DEFAULT 0 COMMENT '灵石 (对接你的积分系统)',
-- 状态机
status VARCHAR(20) DEFAULT 'Idle' COMMENT '玩家状态: Idle, Cultivating, Unstable_Qi, Injured',
status_until DATETIME DEFAULT NULL COMMENT '状态到期时间',
last_cultivate_time DATETIME DEFAULT NULL COMMENT '上次闭关开始时间',
PRIMARY KEY (user_id),
KEY idx_clan_id (clan_id),
KEY idx_realm (realm),
CONSTRAINT fk_clan_id FOREIGN KEY (clan_id) REFERENCES t_xiuxian_clan(clan_id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='玩家核心数据表';
```
### 表 2: `t_xiuxian_clan` (门派表)
```sql
CREATE TABLE t_xiuxian_clan (
clan_id BIGINT NOT NULL AUTO_INCREMENT COMMENT '门派ID',
clan_name VARCHAR(100) NOT NULL COMMENT '门派名称',
group_id VARCHAR(100) NOT NULL COMMENT '所属群ID',
leader_user_id VARCHAR(100) NOT NULL COMMENT '掌门ID',
PRIMARY KEY (clan_id),
UNIQUE KEY uk_group_clan_name (group_id, clan_name) COMMENT '同一群内门派名唯一'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='门派表';
```
### 表 3: `t_xiuxian_item` (物品表 - 静态)
```sql
CREATE TABLE t_xiuxian_item (
item_id INT NOT NULL AUTO_INCREMENT COMMENT '物品ID',
name VARCHAR(100) NOT NULL COMMENT '物品名称',
type VARCHAR(50) NOT NULL COMMENT '物品类型 (丹药, 材料)',
description TEXT COMMENT '物品描述',
PRIMARY KEY (item_id),
UNIQUE KEY uk_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='物品定义表 (静态数据)';
```
*注:开发初期,此表内容可硬编码在 `Config` 中。*
### 表 4: `t_xiuxian_inventory` (玩家背包表)
```sql
CREATE TABLE t_xiuxian_inventory (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '背包条目ID',
user_id VARCHAR(100) NOT NULL COMMENT '玩家ID (外键)',
item_id INT NOT NULL COMMENT '物品ID (外键)',
quantity INT NOT NULL DEFAULT 0 COMMENT '数量',
PRIMARY KEY (id),
UNIQUE KEY uk_user_item (user_id, item_id) COMMENT '同一玩家同种物品只有一条记录',
CONSTRAINT fk_inv_user FOREIGN KEY (user_id) REFERENCES t_xiuxian_player(user_id) ON DELETE CASCADE,
CONSTRAINT fk_inv_item FOREIGN KEY (item_id) REFERENCES t_xiuxian_item(item_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='玩家背包表';
```
-----
## 4\. ⚙️ 核心系统配置 (Config)
这是游戏平衡性的核心,**必须**以配置文件 (如 `config.py`) 存在,**严禁**硬编码在逻辑中。
### 4.1. 灵根配置 (`SPIRIT_ROOT_CONFIG`)
用于 `/注册修仙``/出关`
```python
# 灵根名称: (出现权重, 修为加成乘数)
SPIRIT_ROOT_CONFIG = {
"废灵根": (40, 0.8), # 40% 概率抽到, 修为效率 0.8x
"凡灵根": (30, 1.0), # 30% 概率, 基础效率 1.0x
"真灵根": (15, 1.2), # 15% 概率, 效率 1.2x
"异灵根": (10, 1.5), # 10% 概率, 效率 1.5x
"天灵根": (5, 2.0), # 5% 概率, 效率 2.0x
}
# 基础修为速率 (每小时)
BASE_CULTIVATION_RATE = 100
```
### 4.2. 突破配置 (`BREAKTHROUGH_CONFIG`)
用于 `/突破``/强行突破`。这是**双轨制**设计的核心。
```python
# Key 是玩家当前境界
BREAKTHROUGH_CONFIG = {
"炼气10层": {
"path_pill": {
"name": "丹药突破",
"required_item_id": 101, # 物品ID (筑基丹)
"required_item_name": "筑基丹",
"cultivation_cost": 5000, # 消耗修为 (低)
"base_success_rate": 0.4, # 成功率 (高)
"target_realm": "筑基1层" # 成功后的境界
},
"path_hard": {
"name": "强行突破",
"cultivation_cost": 20000, # 消耗修为 (非常高)
"base_success_rate": 0.1, # 成功率 (非常低)
"target_realm": "筑基2层" # 成功后的境界 (奖励更高!)
}
},
"筑基10层": {
"path_pill": {
"name": "丹药突破",
"required_item_id": 102, # 物品ID (金元丹)
"required_item_name": "金元丹",
"cultivation_cost": 50000,
"base_success_rate": 0.2,
"target_realm": "金丹1层"
},
"path_hard": {
"name": "强行突破",
"cultivation_cost": 200000,
"base_success_rate": 0.05,
"target_realm": "金丹2层"
}
}
# ... 更多境界
}
```
## 5\. 🚀 核心系统设计
### 5.1. Redis 集成 (性能 & 防封)
1. **玩家数据缓存 (Cache-Aside):**
* **Key:** `xiuxian:cache:player:{user_id}`
* **Value:** `t_xiuxian_player` 数据的 JSON 序列化。
* **读取:** 99% 的指令(如 `/我的状态`, `/劫掠` 检查)**必须**先读 Redis。
* **写入:** 所有修改 `Player` 数据的操作(如 `/出关`),在写入 **MariaDB** 成功后,**必须** `DEL` 对应的 Redis 缓存键 (`...player:{user_id}`),实现“写后失效”。
2. **指令冷却 (Rate Limiting) - 防封核心:**
* **Key:** `xiuxian:rate_limit:user:{user_id}:cmd:{command_name}`
* **逻辑:** 在执行**任何**指令前,检查此 Key。如果存在静默失败或回复“操作过于频繁”。如果不存在执行指令`SET` 此 Key设置 `EXPIRE`
* * cooldown 时间见下方指令清单)*
3. **排行榜 (Leaderboard):**
* **Key:** `xiuxian:zset:leaderboard:realm` (Sorted Set)
* **逻辑:** 玩家 `/突破` 成功时,更新其 `Score` (可用境界等级量化)。
### 5.2. 玩家状态机 (防骚扰核心)
这是 `t_xiuxian_player.status` 字段的流转设计,用于平衡 PVP 和 PVE。
| 状态 | 描述 | 能否被劫掠? | 能否 `/闭关`? |
| :--- | :--- | :--- | :--- |
| **`Idle`** (空闲) | 默认状态。 | ✅ **是** (危险) | ✅ **是** |
| **`Cultivating`** (闭关中)| `/闭关` 后进入。 | ❌ **否** (安全) | ❌ 否 |
| **`Unstable_Qi`** (气息不稳)| `/出关` 后进入持续15分钟。 | ✅ **是** (强制暴露) | ❌ **否** (强制CD) |
| **`Injured`** (受伤中) | 被 `/劫掠` 成功后进入持续1小时。| ❌ **否** (PVP保护) | ✅ **是** |
**状态自动流转 (重要)**
所有指令在执行前,都必须调用一个 `check_status_update(user_id)` 函数。
此函数检查玩家 `status` 是否为 `Unstable_Qi``Injured`,并检查 `status_until` 是否已过期。如果已过期,自动将其 `status` 改回 `Idle` (并更新DB和缓存)。
### 5.3. 玩家PVE循环 (成长)
* **`/注册修仙 [道号]`**
1. 检查 `user_id` 是否已存在。
2. 根据 `SPIRIT_ROOT_CONFIG` 的**权重**,为玩家随机抽取一个 `spirit_root`
3. `INSERT``t_xiuxian_player`
4. 回复:"一道灵光注入你的体内...经检测,你的灵根为:**【天灵根】**"
* **`/闭关`**
1. 调用 `check_status_update()`
2. 检查 `status` 必须是 `Idle``Injured`
3. `UPDATE Player SET status='Cultivating', last_cultivate_time=now()`
4. 回复:"你已进入闭关,修行期间无法被劫掠。"
* **`/出关`**
1. 检查 `status` 必须是 `Cultivating`
2. **[平衡点1]** `duration = min(now() - last_cultivate_time, 8 hours)` (8小时收益上限)。
3. **[平衡点2]** `rate = BASE_CULTIVATION_RATE * spirit_root_multiplier` (灵根加成)。
4. `total_gain = duration * rate`
5. **[平衡点3]** `UPDATE Player SET cultivation_points += total_gain, status='Unstable_Qi', status_until=now()+15 minutes`
6. 回复:"你结束了闭关,获得了 X 点修为。你刚出关气息不稳15分钟内无法再次闭关。"
* **`/聚灵 [数量]`**
1. 检查 `spirit_stone` (灵石) 是否 \> `[数量]`
2. `UPDATE Player SET spirit_stone -= [数量], cultivation_points += ([数量] * 10)` (比例可调)。
* **`/突破` (丹药路径)**
1.`BREAKTHROUGH_CONFIG` 获取当前 `realm``path_pill` 配置。
2. 检查 `cultivation_points``背包` (是否有 `required_item_id`)。
3. (不满足) 回复:"丹药突破需:[筑基丹]x1, 修为x5000。你条件不足。"
4. (满足) 扣除资源。Roll点 (按 `base_success_rate`)。
5. (成功) `UPDATE Player SET realm = '筑基1层'`。回复:"【突破成功!】..."
6. (失败) 回复:"【突破失败!】..."
* **`/强行突破` (无丹药路径)**
1.`BREAKTHROUGH_CONFIG` 获取 `path_hard` 配置。
2. 检查 `cultivation_points`
3. (不满足) 回复:"强行突破需修为x20000。你条件不足。"
4. (满足) 扣除修为。Roll点 (按 `base_success_rate`)。
5. (成功) `UPDATE Player SET realm = '筑基2层'`。回复:"【天道酬勤!】你强行突破成功,直达 **筑基2层**"
6. (失败) 回复:"【突破失败!】灵气反噬,你身受重伤!" (可选惩罚:`status` -\> `Injured`)
### 5.4. 经济与PVP/GvG循环
* **`/签到`**
* (对接你的积分系统) 奖励 `spirit_stone`
* **`/坊市`, `/购买`, `/背包`**
* 常规的 `Item``Inventory` 表的 `CRUD` 操作。
* **`/劫掠 @某人`**
1. (调用 `check_status_update()` 检查自己和目标的状态)。
2. **[保护1]** 检查目标 `realm` (例如:必须 "筑基" 以上,新手保护)。
3. **[保护2]** 检查目标 `status` (必须是 `Idle``Unstable_Qi`)。
4. **[保护3]** 检查 `clan_id` (双方 `clan_id` 相同且不为 `NULL` 则禁止同门相残)。
5. (通过) 判定:根据双方 `realm` 计算成功率。
6. (成功) 转移 `spirit_stone``UPDATE Target SET status='Injured', status_until=now()+1 hour`
* **`/赠与 @某人 [数量]` (灵石)**
1. **限制:** 双方 `clan_id` 必须相同且不为 `NULL`
2. **操作:** 转移 `t_xiuxian_player.spirit_stone`
* **`/赠送 @某人 [物品] [数量]` (丹药/物品)**
1. **限制:** 无限制(自由交易)。
2. **操作:** 转移 `t_xiuxian_inventory` 记录 (**必须使用数据库事务**)。
* **`/创建门派`, `/加入门派`, `/退出门派`**
* 常规的 `Clan` 表和 `Player.clan_id``CRUD` 操作。
-----
## 6\. 📋 最终指令清单 (附防封冷却)
| 类别 | 指令 | 冷却 (建议) | 备注 |
| :--- | :--- | :--- | :--- |
| **核心** | `/注册修仙 [道号]` | 1次/天 | 随机灵根 |
| | `/我的状态` | 5 秒 | 显示核心数据 (含灵根) |
| **修行** | `/闭关` | 10 秒 | `status` -\> `Cultivating` (安全) |
| | `/出关` | 10 秒 | 结算修为 (8h上限)。`status` -\> `Unstable_Qi` (危险) |
| | `/聚灵 [数量]` | 30 秒 | (消耗灵石) 灵石 -\> 修为 |
| **突破** | `/突破` | 60 秒 | **[简化]** 丹药路径 (稳妥) |
| | `/强行突破` | 60 秒 | **[简化]** 无丹药路径 (高风险高回报) |
| **经济** | `/签到` | 1次/天 | 获得灵石 |
| | `/坊市` | 10 秒 | 查看商店 |
| | `/购买 [物品] [数量]`| 5 秒 | 灵石 -\> 物品 |
| | `/背包` | 5 秒 | 查看物品 |
| **社交** | `/劫掠 @某人` | 30 秒 | 抢夺灵石 (PVP) |
| | `/赠与 @某人 [数量]` | 10 秒 | **(同门)** 赠送灵石 |
| | `/赠送 @某人 [物品] [数量]`| 10 秒 | **(自由)** 赠送物品/丹药 |
| **门派** | `/创建门派 [名称]` | 1次/天 | |
| | `/加入门派 [名称]` | 1次/周 | |
| | `/退出门派` | 1次/周 | |
| **信息** | `/排行榜` | 60 秒 | 从 Redis 读取 |
-----
## 7\. 🛣️ 建议的开发路线图
1. **Step 1: 基础建设 (V0.1)**
* 搭建数据库 (4个表)。
* 创建 `Config` 文件 (灵根, 突破)。
* 实现 Redis 缓存 `Player` 数据的 `getter/setter`
2. **Step 2: PVE 核心循环 (V0.5)**
* 实现 `/注册修仙`, `/我的状态`
* 实现 `/闭关`, `/出关` (包含灵根加成 和 8小时上限)。
* 实现 `check_status_update()` 函数和 `Unstable_Qi` 状态流转。
3. **Step 3: 经济与突破 (V0.8)**
* 实现 `/坊市`, `/购买`, `/背包`
* 实现 `/聚灵`
* 实现 `/突破``/强行突破` (双轨制)。
4. **Step 4: PVP 与社交 (V1.0)**
* 对接 `/签到``/劫掠` (包含所有保护机制)。
* 实现 `/创建门派`, `/加入门派`
* 实现 `/赠与` (灵石) 和 `/赠送` (物品)。
5. **Step 5: 优化 (V1.1)**
* 实现所有指令的 Redis 冷却 (防封)。
* 实现 `/排行榜` (Redis Sorted Set)。