# mm_os RPG 游戏开发

## 规则（Rules）

- RPG 游戏核心模块：角色系统、背包系统、装备系统、技能系统、任务系统、战斗系统、NPC/商店系统
- 游戏数据表以 `game_rpg_` 前缀命名
- 所有战斗逻辑在服务端执行，客户端只做展示和操作输入
- 角色属性在服务端计算，防止客户端篡改

## 方法（Methods）

### 步骤1：创建游戏 App

使用 `read_work develop_mm_app` 创建 RPG 游戏 App，在 app.json 中标识：

```json
"game": { "type": "rpg" }
```

### 步骤2：设计数据表

**角色系统：**

| 表名 | 用途 | 关键字段 |
|:----|:-----|:---------|
| `game_rpg_player` | 玩家角色数据 | player_id, name, level, exp, hp, mp, str, dex, int, con |
| `game_rpg_attr` | 属性成长配置 | level, exp_need, hp_growth, atk_growth |
| `game_rpg_skill` | 技能模板 | skill_id, name, type, damage, cost, cd, target |
| `game_rpg_player_skill` | 玩家已学技能 | player_id, skill_id, level |
| `game_rpg_equipment` | 装备模板 | equip_id, name, slot, stats, required_level, rarity |
| `game_rpg_inventory` | 玩家背包 | player_id, item_id, item_type, quantity |
| `game_rpg_player_equip` | 玩家穿戴装备 | player_id, slot, equip_id |
| `game_rpg_npc` | NPC 模板 | npc_id, name, dialogue, shop_items |
| `game_rpg_quest` | 任务模板 | quest_id, title, description, condition, reward |
| `game_rpg_player_quest` | 玩家任务进度 | player_id, quest_id, progress, status |

### 步骤3：设计角色属性系统

```javascript
// 角色基础属性
var baseAttr = {
    level: 1, exp: 0,
    hp: 100, mp: 50,
    str: 10,  // 力量 → 物理攻击
    dex: 10,  // 敏捷 → 闪避/暴击
    int: 10,  // 智力 → 魔法攻击
    con: 10   // 体质 → 生命/防御
};

// 升级经验公式
function expForLevel(level) {
    return Math.floor(100 * level * Math.pow(1.2, level - 1));
}

// 由属性和装备计算最终面板
function calcFinalStats(player, equipment) {
    var atk = player.str * 2 + equipment.atk_bonus;
    var def = player.con * 1.5 + equipment.def_bonus;
    var maxHp = player.hp + equipment.hp_bonus;
    var maxMp = player.mp + equipment.mp_bonus;
    return { atk, def, maxHp, maxMp };
}
```

### 步骤4：设计背包与装备系统

| 装备槽位 | 可装备类型 | 属性加成 |
|:---------|:-----------|:---------|
| 武器 | 剑/法杖/弓 | 攻击力、命中 |
| 头盔 | 头盔/帽子 | 防御力、生命 |
| 衣服 | 铠甲/法袍 | 防御力、魔抗 |
| 护手 | 手套/护腕 | 攻击速度 |
| 鞋子 | 靴子/便鞋 | 闪避、速度 |
| 戒指 | 戒指x2 | 各种属性 |
| 项链 | 项链 | 魔法值、回蓝 |

装备穿戴校验：
```javascript
function canEquip(player, equip) {
    if (player.level < equip.required_level) return false;
    if (equip.required_class && player.class !== equip.required_class) return false;
    return true;
}
```

### 步骤5：设计战斗系统

回合制 RPG 战斗流程：

```javascript
async function battle(player, enemy) {
    var turnLog = [];
    while (player.hp > 0 && enemy.hp > 0) {
        // 玩家回合
        var action = await getPlayerAction(player.id);
        var damage = calcDamage(player, enemy, action);
        enemy.hp -= damage;
        turnLog.push({ actor: "player", action, damage });

        if (enemy.hp <= 0) break;

        // 敌人回合
        var enemyAction = aiDecide(enemy);
        var enemyDamage = calcDamage(enemy, player, enemyAction);
        player.hp -= enemyDamage;
        turnLog.push({ actor: "enemy", action: enemyAction, damage: enemyDamage });
    }
    return { winner: player.hp > 0 ? player.id : "enemy", log: turnLog };
}
```

### 步骤6：设计任务系统

| 任务类型 | 条件检测 | 进度存储 |
|:---------|:---------|:---------|
| 击败怪物 | 击杀怪物时检测 | game_rpg_player_quest.progress |
| 收集物品 | 获得物品时检测 | 检查背包数量 |
| 到达地点 | 进入场景时检测 | 记录已到达区域 |
| 对话NPC | 与NPC交互时检测 | 记录已完成对话 |
| 混合型 | 多个条件组合 | 按子条件独立计数 |

### 步骤7：设计NPC和商店

```json
{
    "npc_id": "smith_01",
    "name": "铁匠老王",
    "dialogue": [
        { "trigger": "hello", "text": "欢迎光临，勇士！需要打造点什么吗？" },
        { "trigger": "shop", "text": "看看我的收藏吧！" },
        { "trigger": "quest", "text": "帮我收集10块精铁矿石，我帮你打造一把好武器。" }
    ],
    "shop_items": ["iron_sword", "leather_armor", "hp_potion"],
    "quests": ["quest_smith_01"]
}
```

### 步骤8：实现核心API

| API | 功能 | 方法 |
|:----|:-----|:------|
| `/api/rpg/player/info` | 获取角色信息 | GET |
| `/api/rpg/player/levelup` | 升级 | POST |
| `/api/rpg/inventory/list` | 背包列表 | GET |
| `/api/rpg/equip/wear` | 穿戴装备 | POST |
| `/api/rpg/equip/remove` | 卸下装备 | POST |
| `/api/rpg/skill/learn` | 学习技能 | POST |
| `/api/rpg/skill/list` | 技能列表 | GET |
| `/api/rpg/battle/start` | 开始战斗 | POST |
| `/api/rpg/battle/action` | 战斗操作 | POST |
| `/api/rpg/battle/end` | 结束战斗/逃跑 | POST |
| `/api/rpg/npc/talk` | 与NPC对话 | POST |
| `/api/rpg/npc/buy` | 购买物品 | POST |
| `/api/rpg/npc/sell` | 出售物品 | POST |
| `/api/rpg/quest/list` | 任务列表 | GET |
| `/api/rpg/quest/submit` | 提交任务 | POST |

## 技巧（Tips）

- **属性校验在服务端**：升级加点、装备属性全部在服务端计算验证
- **战斗防篡改**：战斗过程在服务端执行，客户端只发送操作指令和接收结果
- **背包上限**：设计背包容量上限（如100格），超出的物品发送到临时邮箱
- **NPC对话**：对话逻辑放在服务端，支持条件触发（完成任务后对话变化）
- **任务检测**：利用 Event 事件机制监听关键行为（击杀怪物、获得物品）来检测任务进度
- **存档机制**：玩家每次关键操作后自动存档（战斗结束、切换场景）
