@sdd330dev/jy-skill 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/AGENTS.md +148 -0
  2. package/LICENSE +21 -0
  3. package/README.md +177 -0
  4. package/SKILL.md +208 -0
  5. package/assets/characters/0.json +56 -0
  6. package/assets/characters/1.json +60 -0
  7. package/assets/characters/10.json +56 -0
  8. package/assets/characters/100.json +38 -0
  9. package/assets/characters/101.json +38 -0
  10. package/assets/characters/102.json +38 -0
  11. package/assets/characters/103.json +38 -0
  12. package/assets/characters/104.json +38 -0
  13. package/assets/characters/105.json +38 -0
  14. package/assets/characters/106.json +38 -0
  15. package/assets/characters/107.json +38 -0
  16. package/assets/characters/108.json +38 -0
  17. package/assets/characters/109.json +38 -0
  18. package/assets/characters/11.json +56 -0
  19. package/assets/characters/110.json +38 -0
  20. package/assets/characters/12.json +52 -0
  21. package/assets/characters/13.json +56 -0
  22. package/assets/characters/14.json +52 -0
  23. package/assets/characters/15.json +56 -0
  24. package/assets/characters/16.json +56 -0
  25. package/assets/characters/17.json +52 -0
  26. package/assets/characters/18.json +43 -0
  27. package/assets/characters/19.json +56 -0
  28. package/assets/characters/2.json +56 -0
  29. package/assets/characters/20.json +56 -0
  30. package/assets/characters/200.json +48 -0
  31. package/assets/characters/201.json +48 -0
  32. package/assets/characters/202.json +56 -0
  33. package/assets/characters/21.json +52 -0
  34. package/assets/characters/22.json +52 -0
  35. package/assets/characters/23.json +56 -0
  36. package/assets/characters/24.json +43 -0
  37. package/assets/characters/25.json +52 -0
  38. package/assets/characters/26.json +56 -0
  39. package/assets/characters/27.json +52 -0
  40. package/assets/characters/28.json +52 -0
  41. package/assets/characters/29.json +52 -0
  42. package/assets/characters/3.json +60 -0
  43. package/assets/characters/30.json +52 -0
  44. package/assets/characters/300.json +38 -0
  45. package/assets/characters/301.json +38 -0
  46. package/assets/characters/31.json +56 -0
  47. package/assets/characters/32.json +47 -0
  48. package/assets/characters/33.json +47 -0
  49. package/assets/characters/34.json +52 -0
  50. package/assets/characters/35.json +56 -0
  51. package/assets/characters/36.json +52 -0
  52. package/assets/characters/37.json +52 -0
  53. package/assets/characters/38.json +56 -0
  54. package/assets/characters/39.json +52 -0
  55. package/assets/characters/4.json +56 -0
  56. package/assets/characters/40.json +56 -0
  57. package/assets/characters/41.json +52 -0
  58. package/assets/characters/42.json +52 -0
  59. package/assets/characters/43.json +52 -0
  60. package/assets/characters/44.json +52 -0
  61. package/assets/characters/45.json +56 -0
  62. package/assets/characters/46.json +56 -0
  63. package/assets/characters/47.json +47 -0
  64. package/assets/characters/48.json +52 -0
  65. package/assets/characters/49.json +38 -0
  66. package/assets/characters/5.json +60 -0
  67. package/assets/characters/50.json +38 -0
  68. package/assets/characters/51.json +38 -0
  69. package/assets/characters/52.json +38 -0
  70. package/assets/characters/53.json +38 -0
  71. package/assets/characters/54.json +38 -0
  72. package/assets/characters/55.json +38 -0
  73. package/assets/characters/56.json +38 -0
  74. package/assets/characters/57.json +38 -0
  75. package/assets/characters/58.json +38 -0
  76. package/assets/characters/59.json +38 -0
  77. package/assets/characters/6.json +56 -0
  78. package/assets/characters/60.json +38 -0
  79. package/assets/characters/61.json +38 -0
  80. package/assets/characters/62.json +38 -0
  81. package/assets/characters/63.json +38 -0
  82. package/assets/characters/64.json +38 -0
  83. package/assets/characters/65.json +38 -0
  84. package/assets/characters/66.json +38 -0
  85. package/assets/characters/67.json +38 -0
  86. package/assets/characters/68.json +38 -0
  87. package/assets/characters/69.json +38 -0
  88. package/assets/characters/7.json +64 -0
  89. package/assets/characters/70.json +38 -0
  90. package/assets/characters/71.json +38 -0
  91. package/assets/characters/72.json +38 -0
  92. package/assets/characters/73.json +38 -0
  93. package/assets/characters/74.json +38 -0
  94. package/assets/characters/75.json +38 -0
  95. package/assets/characters/76.json +38 -0
  96. package/assets/characters/77.json +38 -0
  97. package/assets/characters/78.json +38 -0
  98. package/assets/characters/79.json +38 -0
  99. package/assets/characters/8.json +60 -0
  100. package/assets/characters/80.json +38 -0
  101. package/assets/characters/81.json +38 -0
  102. package/assets/characters/82.json +38 -0
  103. package/assets/characters/83.json +38 -0
  104. package/assets/characters/84.json +38 -0
  105. package/assets/characters/85.json +38 -0
  106. package/assets/characters/86.json +38 -0
  107. package/assets/characters/87.json +38 -0
  108. package/assets/characters/88.json +38 -0
  109. package/assets/characters/89.json +38 -0
  110. package/assets/characters/9.json +56 -0
  111. package/assets/characters/90.json +38 -0
  112. package/assets/characters/91.json +38 -0
  113. package/assets/characters/92.json +38 -0
  114. package/assets/characters/93.json +38 -0
  115. package/assets/characters/94.json +38 -0
  116. package/assets/characters/95.json +38 -0
  117. package/assets/characters/96.json +38 -0
  118. package/assets/characters/97.json +38 -0
  119. package/assets/characters/98.json +38 -0
  120. package/assets/characters/99.json +38 -0
  121. package/assets/characters/index.json +584 -0
  122. package/assets/game-config.json +855 -0
  123. package/assets/items.json +1060 -0
  124. package/assets/skills.json +829 -0
  125. package/assets/templates.json +127 -0
  126. package/package.json +80 -0
  127. package/references/agent-handbook.md +308 -0
  128. package/references/game-design.md +124 -0
  129. package/references/player-guide.md +176 -0
  130. package/scripts/config-loader.ts +408 -0
  131. package/scripts/game-engine.ts +617 -0
  132. package/scripts/game-logic.ts +153 -0
  133. package/scripts/game-types.ts +46 -0
  134. package/scripts/install-skill.mjs +115 -0
  135. package/scripts/persistence.ts +135 -0
@@ -0,0 +1,127 @@
1
+ {
2
+ "defaultCharacter": {
3
+ "name": "主角",
4
+ "level": 1,
5
+ "exp": 0,
6
+ "hp": 100,
7
+ "maxHp": 100,
8
+ "mp": 50,
9
+ "maxMp": 50,
10
+ "stamina": 100,
11
+ "poison": 0,
12
+ "hurt": 0,
13
+ "attributes": {
14
+ "maxHp": 100,
15
+ "maxMp": 50,
16
+ "hp": 100,
17
+ "mp": 50,
18
+ "hpInc": 5,
19
+ "attack": 20,
20
+ "agility": 15,
21
+ "defence": 10,
22
+ "heal": 0,
23
+ "usePoison": 0,
24
+ "dePoison": 0,
25
+ "antiPoison": 0,
26
+ "fist": 0,
27
+ "sword": 0,
28
+ "blade": 0,
29
+ "exotic": 0,
30
+ "hiddenWeapon": 0,
31
+ "martialKnowledge": 0,
32
+ "attackPoison": 0,
33
+ "ambidextrous": 0,
34
+ "iq": 50,
35
+ "morality": 50,
36
+ "reputation": 0,
37
+ "stamina": 100,
38
+ "poison": 0,
39
+ "hurt": 0,
40
+ "mpType": "neutral",
41
+ "level": 1,
42
+ "exp": 0
43
+ },
44
+ "equipment": {
45
+ "weapon": null,
46
+ "armor": null
47
+ },
48
+ "skills": ["基本拳法"]
49
+ },
50
+ "startLocation": "小村",
51
+ "enemies": {
52
+ "山贼": { "characterId": 200 },
53
+ "强盗": { "characterId": 201 },
54
+ "武林高手": { "characterId": 202 },
55
+ "老虎": { "hp": 150, "attack": 35, "defence": 20, "solo": true },
56
+ "毒蛇": { "hp": 60, "attack": 10, "defence": 5, "solo": true }
57
+ },
58
+ "defaultInventory": {
59
+ "silver": 100,
60
+ "items": [
61
+ { "id": "30", "name": "金创药", "count": 5 },
62
+ { "id": "35", "name": "干粮", "count": 3 }
63
+ ]
64
+ },
65
+ "maps": {
66
+ "小村": {
67
+ "npcs": ["村长", "商人"],
68
+ "shops": ["金创药", "小还丹", "干粮"],
69
+ "connections": ["平安镇", "山洞"]
70
+ },
71
+ "平安镇": {
72
+ "npcs": ["守卫", "商店老板", "客栈老板"],
73
+ "shops": ["铁剑", "钢刀", "布衣", "皮甲", "金创药", "小还丹"],
74
+ "connections": ["小村", "华山", "桃花岛", "全真教", "光明顶"]
75
+ },
76
+ "山洞": {
77
+ "npcs": ["神秘人"],
78
+ "shops": [],
79
+ "connections": ["小村"],
80
+ "encounters": { "rate": 20, "enemies": ["山贼", "强盗", "老虎"] }
81
+ },
82
+ "华山": {
83
+ "npcs": ["王重阳"],
84
+ "shops": [],
85
+ "connections": ["平安镇"]
86
+ },
87
+ "桃花岛": {
88
+ "npcs": ["黄药师", "黄蓉"],
89
+ "shops": [],
90
+ "connections": ["平安镇"]
91
+ },
92
+ "全真教": {
93
+ "npcs": ["王重阳", "周伯通"],
94
+ "shops": [],
95
+ "connections": ["平安镇"]
96
+ },
97
+ "光明顶": {
98
+ "npcs": ["张无忌"],
99
+ "shops": [],
100
+ "connections": ["平安镇"]
101
+ }
102
+ },
103
+ "skills": [
104
+ { "id": 1, "name": "基本拳法", "type": "point", "range": 1, "mpCost": 0, "damage": 10, "source": "基础" },
105
+ { "id": 2, "name": "基本刀法", "type": "point", "range": 1, "mpCost": 0, "damage": 12, "source": "基础" },
106
+ { "id": 3, "name": "六脉神剑", "type": "line", "range": 3, "mpCost": 30, "damage": 40, "source": "天龙八部" },
107
+ { "id": 4, "name": "北冥神功", "type": "point", "range": 1, "mpCost": 10, "damage": 15, "source": "天龙八部" },
108
+ { "id": 5, "name": "凌波微步", "type": "none", "range": 0, "mpCost": 20, "damage": 0, "source": "天龙八部" },
109
+ { "id": 6, "name": "降龙十八掌", "type": "cross", "range": 2, "mpCost": 25, "damage": 50, "source": "射雕英雄传" },
110
+ { "id": 10, "name": "独孤九剑", "type": "point", "range": 1, "mpCost": 20, "damage": 45, "source": "笑傲江湖" },
111
+ { "id": 12, "name": "九阴真经", "type": "area", "range": 3, "mpCost": 35, "damage": 55, "source": "射雕英雄传" },
112
+ { "id": 13, "name": "九阳神功", "type": "point", "range": 1, "mpCost": 15, "damage": 25, "source": "倚天屠龙记" },
113
+ { "id": 18, "name": "太极拳", "type": "point", "range": 1, "mpCost": 15, "damage": 30, "source": "倚天屠龙记" }
114
+ ],
115
+ "items": [
116
+ { "id": 1, "name": "银两", "type": "currency", "price": 0 },
117
+ { "id": 10, "name": "铁剑", "type": "weapon", "price": 100, "attack": 10 },
118
+ { "id": 11, "name": "钢刀", "type": "weapon", "price": 200, "attack": 20 },
119
+ { "id": 20, "name": "布衣", "type": "armor", "price": 50, "defence": 5 },
120
+ { "id": 21, "name": "皮甲", "type": "armor", "price": 200, "defence": 15 },
121
+ { "id": 30, "name": "金创药", "type": "consumable", "price": 20, "hp": 50 },
122
+ { "id": 31, "name": "大还丹", "type": "consumable", "price": 100, "hp": 150 },
123
+ { "id": 33, "name": "小还丹", "type": "consumable", "price": 30, "mp": 50 },
124
+ { "id": 35, "name": "干粮", "type": "consumable", "price": 5, "stamina": 20 },
125
+ { "id": 36, "name": "解毒丸", "type": "consumable", "price": 50, "dePoison": 50 }
126
+ ]
127
+ }
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@sdd330dev/jy-skill",
3
+ "version": "0.3.0",
4
+ "description": "金庸群侠传 Cursor Agent Skill — 对话式武侠 RPG,自然语言驱动移动、战斗与存档",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "cursor",
9
+ "cursor-skill",
10
+ "agent-skill",
11
+ "rpg",
12
+ "金庸群侠传",
13
+ "jy"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/sdd330/jy-skill.git"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/sdd330/jy-skill/issues"
21
+ },
22
+ "homepage": "https://github.com/sdd330/jy-skill#readme",
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "packageManager": "pnpm@11.8.0",
27
+ "engines": {
28
+ "node": ">=20.19.0"
29
+ },
30
+ "bin": {
31
+ "jy-skill": "scripts/install-skill.mjs"
32
+ },
33
+ "files": [
34
+ "SKILL.md",
35
+ "AGENTS.md",
36
+ "LICENSE",
37
+ "references",
38
+ "assets",
39
+ "save/.gitkeep",
40
+ "scripts/game-engine.ts",
41
+ "scripts/game-logic.ts",
42
+ "scripts/config-loader.ts",
43
+ "scripts/persistence.ts",
44
+ "scripts/game-types.ts",
45
+ "scripts/install-skill.mjs"
46
+ ],
47
+ "scripts": {
48
+ "test": "vitest run",
49
+ "test:skill": "vitest run",
50
+ "test:logic": "vitest run scripts/game-logic.test.ts",
51
+ "test:engine": "vitest run scripts/game-engine.test.ts",
52
+ "test:coverage": "vitest run --coverage",
53
+ "typecheck": "tsc --noEmit",
54
+ "lint": "oxlint --fix scripts vite.config.ts",
55
+ "format": "oxfmt scripts vite.config.ts",
56
+ "check": "oxlint scripts vite.config.ts && oxfmt --check scripts vite.config.ts",
57
+ "validate:meta": "tsx scripts/validate-skill.ts",
58
+ "validate:skill": "tsx scripts/validate-assets.ts",
59
+ "validate:pack": "tsx scripts/validate-pack.ts",
60
+ "validate:versions": "tsx scripts/validate-versions.ts",
61
+ "validate:docs": "tsx scripts/validate-docs.ts",
62
+ "validate:npm": "node scripts/validate-npm-pack.mjs",
63
+ "validate": "pnpm run validate:meta && pnpm run validate:skill && pnpm run validate:versions && pnpm run validate:docs",
64
+ "audit:ci": "pnpm audit --audit-level=high",
65
+ "prepack": "pnpm run validate:versions",
66
+ "publish:npm": "npm publish --access public",
67
+ "ci": "pnpm run check && pnpm run typecheck && pnpm run validate && pnpm run validate:pack && pnpm run validate:npm && pnpm run audit:ci && pnpm run test:coverage",
68
+ "pack:skill": "node scripts/pack-skill.mjs"
69
+ },
70
+ "devDependencies": {
71
+ "@types/node": "^25.0.2",
72
+ "@vitest/coverage-v8": "^4.1.9",
73
+ "oxfmt": "^0.55.0",
74
+ "oxlint": "^1.70.0",
75
+ "tsx": "^4.19.4",
76
+ "typescript": "~6.0.3",
77
+ "vite": "^8.0.16",
78
+ "vitest": "^4.1.9"
79
+ }
80
+ }
@@ -0,0 +1,308 @@
1
+ # 金庸群侠传 · 智能体操作手册
2
+
3
+ 面向 Agent 的完整玩法与逻辑说明。玩家向文案见 [player-guide.md](player-guide.md);叙事风格见 [AGENTS.md](../AGENTS.md)。
4
+
5
+ ---
6
+
7
+ ## 1. 核心职责
8
+
9
+ 你是**叙述者 + 执行者**,必须:
10
+
11
+ 1. **只通过** `scripts/game-engine.ts` 改变游戏状态,禁止手改 `save/game-state.json` 或心算数值。
12
+ 2. **每次状态变更后**引擎自动存档;回复结束前可幂等调用 `saveGameState(state)`。
13
+ 3. **用武侠文风**叙述 API 返回的 `message`,勿向玩家暴露函数名。
14
+ 4. **失败时**根据 `success: false` 的 `message` 用自然语言解释,并给出可行替代(如「银两不足,可先卖…」→ 本版无出售,应建议去商人处或减少购买)。
15
+ 5. **数值以引擎为准**:伤害、经验、升级、物品消耗均由 `game-logic.ts` / `game-engine.ts` 计算。
16
+
17
+ ---
18
+
19
+ ## 2. 每轮决策流程
20
+
21
+ ```
22
+ 玩家输入
23
+
24
+ 解析意图(可含多步:「去平安镇买铁剑」)
25
+
26
+ 若无 state → loadOrCreateGame(createNewGame, '主角')
27
+
28
+ 按顺序调用 API(移动 → 遇敌?→ 购物 → …)
29
+
30
+ moveTo 若返回 encounter → 必须 startBattle 并打完或玩家死亡
31
+
32
+ 战斗后 isDead(state) ? → 死亡结算 + restartGame()
33
+
34
+ getStatus(state) 生成状态栏,附在回复末尾
35
+ ```
36
+
37
+ **复合指令**:按逻辑顺序逐步调用。例:「去平安镇买铁剑并装备」→ `moveTo` → 若 `encounter` 先战斗 → `buyItem` → `equipItem`。
38
+
39
+ **续玩 vs 新游戏**:
40
+
41
+ | 场景 | 做法 |
42
+ |------|------|
43
+ | 「jy / 开始游戏」 | `loadOrCreateGame`;`isNewGame === true` 时做首登引导 |
44
+ | 「重新开始 / 新游戏」 | `restartGame()`,勿只 `deleteSave` 不落盘 |
45
+ | 战斗后 HP≤0 | 死亡叙述 → `restartGame()` |
46
+
47
+ ---
48
+
49
+ ## 3. 游戏规则(引擎实现)
50
+
51
+ ### 3.1 时间与移动
52
+
53
+ - **`moveTo(state, destination)`** 成功时:
54
+ - 更新 `state.location`
55
+ - 体力 **-5**(不低于 0)
56
+ - **周数 +1**
57
+ - 若中毒/受伤,触发每周掉血(见下)
58
+ - 可能触发 **随机遇敌**(见 3.6)
59
+ - **目的地**必须是当前地图 `connections` 中的**精确名称**(如「平安镇」,非「平安」)。
60
+ - **`destination === 'random'`**:随机选一条相连道路(玩家说「随便走走」时用)。
61
+
62
+ ### 3.2 中毒与受伤
63
+
64
+ 移动推进周数后(`advanceWeekEffects`):
65
+
66
+ - 中毒掉血 = `floor(中毒值 / 10)`,HP 最低保留 **1**
67
+ - 受伤掉血 = `floor(受伤值 / 20)`,HP 最低保留 **1**
68
+ - **`rest(state)`** 可满血满内力满体力并清零中毒、受伤。
69
+
70
+ ### 3.3 物品
71
+
72
+ | 物品 | 效果(配置值,实际恢复量可更少) |
73
+ |------|----------------------------------|
74
+ | 金创药 | +HP |
75
+ | 小还丹 | +MP |
76
+ | 干粮 | +体力 |
77
+ | 解毒丸 | 解毒 |
78
+
79
+ **重要**:`useItem` 按**实际收益**扣物品;生命/内力/体力已满或无毒时 **不消耗**,返回失败 message。叙述时引用 API 返回的实际恢复量。
80
+
81
+ ### 3.4 装备
82
+
83
+ - `equipItem` 仅支持**武器**(铁剑、钢刀等)和**防具**(布衣、皮甲等)。
84
+ - 装备后攻击/防御在战斗中通过 `getEffectiveAttack` / `getEffectiveDefence` 生效。
85
+ - 装备**不消耗**背包数量(与使用品不同)。
86
+
87
+ ### 3.5 升级
88
+
89
+ - 击败敌人获得经验:`10 + 敌人maxHp/10`
90
+ - 升级所需:`floor(100 × 1.5^(等级-1))`
91
+ - 最高 **Lv.100**;满级后 `getStatus` 显示「经验: N(已满级)」
92
+ - 升级时 maxHp/maxMp/攻防提升,HP/MP 回满
93
+
94
+ ### 3.6 随机遇敌
95
+
96
+ 配置于 `assets/templates.json` 各地图 `encounters` 字段。当前实现:
97
+
98
+ | 地点 | 概率 | 敌人池 |
99
+ |------|------|--------|
100
+ | 山洞 | 20% | 山贼、强盗、老虎 |
101
+
102
+ `moveTo` 抵达后若触发,返回 `{ encounter: '山贼' }` 等。**Agent 必须**在同一轮或下一轮立即 `startBattle(state, encounter)` 并进入战斗循环,不可忽略。
103
+
104
+ ### 3.7 商店与对话
105
+
106
+ - **`buyItem`**:物品须在**当前地点** `shops` 列表中,且银两 ≥ 价格。
107
+ - **`talkTo`**:NPC 名须与当前地点 `npcs` **完全一致**。
108
+ - **`talkTo(state, 'random')`**:随机与在场 NPC 对话。
109
+ - 有配置对话的 NPC 返回「说话者:「台词」」格式。
110
+
111
+ ### 3.8 武功
112
+
113
+ - 新角色默认:**基本拳法**(不耗内力)。
114
+ - **`learnSkill`**:武功须存在于 `assets/skills.json`;已学会则失败。
115
+ - **`useSkillInBattle`**:须已学会且内力 ≥ 消耗;消耗公式见 `game-logic.ts`。
116
+ - **已知限制**:战斗中 `skillLevels` 暂不增长(等级恒为 0 索引)。
117
+
118
+ ---
119
+
120
+ ## 4. 战斗系统
121
+
122
+ ### 4.1 开战
123
+
124
+ ```typescript
125
+ const { success, message, enemies } = startBattle(state, '山贼')
126
+ ```
127
+
128
+ - 敌人名须在 `templates.json` → `enemies` 中(山贼、强盗、武林高手、老虎、毒蛇)。
129
+ - **solo 敌人**(老虎、毒蛇及标记 solo):仅 1 个。
130
+ - 其他敌人:随机 **1~3** 个,名称可能为 `山贼1`、`山贼2`…
131
+ - `enemies` 为**内存临时数组**,不写入存档;每轮战斗重新 `startBattle` 或沿用同一数组直至结束。
132
+
133
+ ### 4.2 回合循环
134
+
135
+ ```
136
+ while (尚有敌人 hp > 0 && !isDead(state)) {
137
+ // 玩家回合
138
+ attackEnemy(state, enemies, targetIndex)
139
+ 或 useSkillInBattle(state, enemies, skillName, targetIndex)
140
+
141
+ // 若仍有存活敌人
142
+ enemyAttack(state, enemies) // 随机一名存活敌人反击
143
+
144
+ // 检查 isDead(state)
145
+ }
146
+ ```
147
+
148
+ - **`targetIndex`**:0 基,对应 `enemies` 数组下标;优先攻击 HP>0 的敌人。
149
+ - 普攻消耗 **3** 体力;武功也消耗 **3** 体力 + 内力。
150
+ - 敌人伤害 = `max(1, 敌人攻击 - 玩家有效防御)`。
151
+ - 玩家伤害由 `calculateDamage` 计算(含 ±20% 波动,**不可自行编造**)。
152
+
153
+ ### 4.3 战斗叙述建议
154
+
155
+ - 每回合简述「你出招 / 敌人反击 / 剩余 HP」。
156
+ - 多敌人时说明攻击目标名称(用 `enemies[i].name`)。
157
+ - 战斗结束总结:经验获得、是否升级、剩余状态。
158
+
159
+ ---
160
+
161
+ ## 5. API 完整参考
162
+
163
+ 所有函数自 `scripts/game-engine.ts` 导入。
164
+
165
+ ### 存档与初始化
166
+
167
+ | 函数 | 返回 | 说明 |
168
+ |------|------|------|
169
+ | `loadOrCreateGame(createNewGame, name?)` | `{ state, isNewGame }` | 有档续玩,无档新建落盘 |
170
+ | `loadGameState()` | `GameState \| null` | 仅读取,不创建 |
171
+ | `saveGameState(state)` | void | 幂等手动存档 |
172
+ | `deleteSave()` | void | 仅删档;重开请用 `restartGame` |
173
+ | `restartGame(name?)` | `GameState` | 删档 + 新建 + 落盘 |
174
+ | `createNewGame(name)` | `GameState` | 仅内存,不自动存档 |
175
+
176
+ ### 查询
177
+
178
+ | 函数 | 说明 |
179
+ |------|------|
180
+ | `getStatus(state)` | 状态栏文本(含经验、中毒/受伤行) |
181
+ | `getInventory(state)` | 银两 + 物品列表 |
182
+ | `getSkills(state)` | 已学武功 |
183
+ | `getLocationInfo(state)` | 当前地点:可前往、NPC、商店、险地提示 |
184
+
185
+ ### 探索与交互
186
+
187
+ | 函数 | 返回 | 失败常见原因 |
188
+ |------|------|--------------|
189
+ | `moveTo(state, dest)` | `{ success, message, encounter? }` | 不相连、无处可去 |
190
+ | `talkTo(state, npc)` | `{ success, message }` | NPC 不在场 |
191
+ | `rest(state)` | `{ success, message }` | 一般总成功 |
192
+ | `buyItem(state, item)` | `{ success, message }` | 非本店、无货、银两不足 |
193
+ | `useItem(state, item)` | `{ success, message }` | 无物品、非消耗品、无收益 |
194
+ | `equipItem(state, item)` | `{ success, message }` | 无物品、不可装备 |
195
+ | `learnSkill(state, skill)` | `{ success, message }` | 不存在、已学会 |
196
+
197
+ ### 战斗
198
+
199
+ | 函数 | 说明 |
200
+ |------|------|
201
+ | `startBattle(state, enemyName)` | 返回 `enemies[]` |
202
+ | `attackEnemy(state, enemies, i)` | 返回 `{ message, enemyDefeated, playerDamage }` |
203
+ | `useSkillInBattle(state, enemies, skill, i)` | 返回 `{ success, message }` |
204
+ | `enemyAttack(state, enemies)` | 返回 `{ message, playerDefeated }` |
205
+ | `isDead(state)` | `character.hp <= 0` |
206
+
207
+ ---
208
+
209
+ ## 6. 世界速查(`assets/templates.json`)
210
+
211
+ 地图只能走**相邻**连接;各门派经**平安镇**枢纽。
212
+
213
+ | 地点 | 可前往 | NPC | 商店 |
214
+ |------|--------|-----|------|
215
+ | 小村 | 平安镇、山洞 | 村长、商人 | 金创药、小还丹、干粮 |
216
+ | 平安镇 | 小村、华山、桃花岛、全真教、光明顶 | 守卫、商店老板、客栈老板 | 铁剑、钢刀、布衣、皮甲、金创药、小还丹 |
217
+ | 山洞 | 小村 | 神秘人 | 无(20% 遇敌) |
218
+ | 华山 | 平安镇 | 王重阳 | 无 |
219
+ | 桃花岛 | 平安镇 | 黄药师、黄蓉 | 无 |
220
+ | 全真教 | 平安镇 | 王重阳、周伯通 | 无 |
221
+ | 光明顶 | 平安镇 | 张无忌 | 无 |
222
+
223
+ **可战斗敌人**(任意地点可主动开战):山贼、强盗、武林高手、老虎、毒蛇。
224
+
225
+ **新角色初始**:小村、100 银两、金创药×5、干粮×3、基本拳法、HP/MP/体力满值。
226
+
227
+ > 完整数值与扩展设计见 `assets/` 与 [game-design.md](game-design.md)。**禁止**在叙述中编造未在 assets 出现的物品价、敌人 HP 或地图连接。
228
+
229
+ ---
230
+
231
+ ## 7. GameState 结构(只读理解)
232
+
233
+ ```typescript
234
+ interface GameState {
235
+ character: {
236
+ name, level, exp, hp, maxHp, mp, maxMp, stamina
237
+ poison, hurt
238
+ attributes // 攻防等,来自 game-logic DEFAULT_ATTRIBUTES
239
+ equipment: { weapon, armor }
240
+ skills: string[]
241
+ skillLevels: Record<string, number>
242
+ }
243
+ inventory: { silver, items: [{ id, name, count }] }
244
+ location: string
245
+ week: number
246
+ flags, visitedMaps, completedQuests, team
247
+ }
248
+ ```
249
+
250
+ ---
251
+
252
+ ## 8. 禁止与常见错误
253
+
254
+ | 错误 | 正确做法 |
255
+ |------|----------|
256
+ | 手改 JSON 存档 | 只调 engine API |
257
+ | 忽略 `moveTo.encounter` | 立即 `startBattle` |
258
+ | 编造伤害/经验数字 | 只用 API 返回值叙述 |
259
+ | 使用不存在的 NPC(如「店小二」) | 查 `getLocationInfo` 或上表 |
260
+ | 跨地图一步到达(小村→华山) | 先经平安镇 |
261
+ | 满血仍描述「服下药丸」且扣物品 | 先 `useItem`,失败则如实告知 |
262
+ | 死亡后只删档不新建 | `restartGame()` |
263
+ | 战斗中使用已阵亡敌人的 index | 选 `hp > 0` 的下标 |
264
+ | 向玩家展示 `moveTo(state,…)` 代码 | 武侠化叙述 |
265
+
266
+ ---
267
+
268
+ ## 9. 交互示例(完整链)
269
+
270
+ ### 移动遇敌
271
+
272
+ ```
273
+ moveTo(state, '山洞')
274
+ → success, encounter: '老虎'
275
+ → startBattle(state, '老虎')
276
+ → 循环 attackEnemy / enemyAttack 直至结束
277
+ → getStatus(state)
278
+ ```
279
+
280
+ ### 帮助
281
+
282
+ ```
283
+ getLocationInfo(state) + getStatus(state)
284
+ → 按 AGENTS.md 模板用自然语言说明,附状态栏
285
+ ```
286
+
287
+ ### 死亡
288
+
289
+ ```
290
+ isDead(state) === true
291
+ → 叙述陨落 + 结算(level, week, silver)
292
+ → restartGame('主角')
293
+ → 简短新人生开场 + 状态栏
294
+ ```
295
+
296
+ ---
297
+
298
+ ## 10. 文档索引
299
+
300
+ | 文件 | 用途 |
301
+ |------|------|
302
+ | [SKILL.md](../SKILL.md) | Skill 入口、快速开始 |
303
+ | [AGENTS.md](../AGENTS.md) | 叙事、首登、帮助模板 |
304
+ | [player-guide.md](player-guide.md) | 玩家 FAQ、地图图 |
305
+ | [game-design.md](game-design.md) | 公式与设计细节 |
306
+ | `scripts/game-engine.ts` | 唯一 API |
307
+ | `scripts/game-logic.ts` | 唯一公式 |
308
+ | `assets/templates.json` | 地图、敌人、初始配置 |
@@ -0,0 +1,124 @@
1
+ # 金庸群侠传 · 游戏设计文档
2
+
3
+ ## 文档导航
4
+
5
+ | 读者 | 推荐阅读 |
6
+ |------|----------|
7
+ | 玩家 | [player-guide.md](player-guide.md) — 上手、地图、战斗、FAQ |
8
+ | Agent | [agent-handbook.md](agent-handbook.md) — 完整规则与 API;[SKILL.md](../SKILL.md) + [AGENTS.md](../AGENTS.md) — 入口与叙事 |
9
+ | 开发者 | 本文档 + `scripts/game-logic.ts` — 公式与设计参考 |
10
+
11
+ **说明**:当前对话版引擎采用**地点跳转式**探索(相邻地图移动、自然语言驱动),而非下方部分章节描述的网格战棋;实现以 `scripts/game-engine.ts` 为准。
12
+
13
+ ---
14
+
15
+ ## 游戏概述
16
+
17
+ 金庸群侠传是一款基于金庸武侠世界的对话式 RPG。玩家通过自然语言与智能体对话,体验武侠冒险。
18
+
19
+ ## 核心玩法
20
+
21
+ ### 角色系统
22
+ - 角色有 40+ 属性:生命、内力、武力、轻功、防御等
23
+ - 角色可装备武器和防具
24
+ - 角色可学习武功,武功有 10 个等级
25
+ - 角色通过战斗获得经验,升级提升属性
26
+
27
+ ### 战斗系统(对话版实现)
28
+
29
+ - 回合制:玩家攻击 → 敌人反击,循环至战斗结束
30
+ - 普通攻击消耗体力;武功消耗内力
31
+ - 支持左右互搏、武学常识等公式加成(见 `game-logic.ts`)
32
+ - 中毒/受伤每周持续掉血
33
+
34
+ ### 战斗系统(完整设计参考)
35
+
36
+ 以下为扩展设计,供后续版本参考:
37
+
38
+ - 按轻功排序行动顺序
39
+ - 每回合可移动 + 攻击/使用技能/使用物品/等待
40
+
41
+ ### 物品系统
42
+ - 物品分类:装备、消耗品、书籍、暗器
43
+ - 消耗品可恢复生命/内力/体力
44
+ - 装备可提升属性
45
+ - 书籍可学习武功
46
+
47
+ ### 技能系统
48
+ - 技能有 10 个等级
49
+ - 内力消耗:`MpCost * ((level+1)/2)`
50
+ - 体力消耗:普通3/用毒2/解毒2/医疗4
51
+ - 技能升级:每次使用增加 1-3 经验,100 升级
52
+
53
+ ### 地图系统(对话版实现)
54
+
55
+ - 7 个地点:小村、平安镇、山洞、华山、桃花岛、全真教、光明顶
56
+ - 只能在相邻地点间移动;移动消耗体力并推进周数
57
+ - 支持 NPC 对话、商店购买
58
+ - **随机遇敌**:配置于 `assets/templates.json` 各地图 `encounters` 字段;进入险地(如山洞,20% 概率)时 `moveTo` 返回 `encounter`,Agent 须接着调用 `startBattle`
59
+
60
+ ### 地图系统(完整设计参考)
61
+
62
+ - 2D 网格地图(扩展设计)
63
+ - 支持随机遇敌
64
+
65
+ ## 游戏公式
66
+
67
+ ### 升级
68
+ ```
69
+ 升级经验 = floor(100 × 1.5^(等级-1))
70
+ 升级时:
71
+ maxHp += (hpInc + random(0,3)) × 3
72
+ attrGain = random(0, floor((资质-10)/20) + 2) + 1
73
+ maxMp += (9 - attrGain) × 4
74
+ 武力/轻功/防御 += attrGain
75
+ ```
76
+
77
+ ### 战斗伤害
78
+ ```
79
+ 伤害 = 武力 + 技能攻击力 - 敌方防御
80
+ 左右互搏: ×1.5
81
+ 武学常识加成: +武学常识/10
82
+ 随机波动: ±20%
83
+ 最低伤害: 1
84
+ ```
85
+
86
+ ### 中毒/受伤
87
+ ```
88
+ 中毒掉血 = 中毒值 / 10
89
+ 受伤掉血 = 受伤值 / 20
90
+ 最低保留 1 HP
91
+ ```
92
+
93
+ ### 武功消耗
94
+ ```
95
+ 内力消耗 = 基础消耗 × ((等级+1)/2)
96
+ 体力消耗: 普通攻击3, 用毒2, 解毒2, 医疗4
97
+ ```
98
+
99
+ ### 移动力
100
+ ```
101
+ 移动力 = 轻功/15 + 3
102
+ ```
103
+
104
+ ## 配置数据
105
+
106
+ ### 角色配置
107
+ - 116 个角色(金庸原著角色)
108
+ - 每个角色单独 JSON 文件
109
+ - 包含属性、技能、物品、装备
110
+
111
+ ### 武功配置
112
+ - 25 种武功
113
+ - 每种武功 10 个等级
114
+ - 5 种覆盖类型:点、线、十字、矩形、菱形
115
+
116
+ ### 物品配置
117
+ - 28 种物品
118
+ - 武器、防具、消耗品、经书、暗器
119
+
120
+ ### 地图配置
121
+
122
+ - 7 个地点:小村、平安镇、山洞、华山、桃花岛、全真教、光明顶
123
+ - 敌人模板:山贼、强盗、武林高手、老虎、毒蛇等
124
+ - 对话与 NPC 配置见 `assets/game-config.json`