pi-jinyong-xia 1.0.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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +378 -0
  3. package/dist/assets/portrait-ascii/portrait-data.json +1 -0
  4. package/dist/extensions/characters.d.ts +19 -0
  5. package/dist/extensions/characters.js +52 -0
  6. package/dist/extensions/characters.js.map +1 -0
  7. package/dist/extensions/index.d.ts +1 -0
  8. package/dist/extensions/index.js +20 -0
  9. package/dist/extensions/index.js.map +1 -0
  10. package/dist/extensions/missions-mbti.d.ts +39 -0
  11. package/dist/extensions/missions-mbti.js +101 -0
  12. package/dist/extensions/missions-mbti.js.map +1 -0
  13. package/dist/extensions/missions-templates-danger.d.ts +5 -0
  14. package/dist/extensions/missions-templates-danger.js +432 -0
  15. package/dist/extensions/missions-templates-danger.js.map +1 -0
  16. package/dist/extensions/missions-templates-safe.d.ts +34 -0
  17. package/dist/extensions/missions-templates-safe.js +307 -0
  18. package/dist/extensions/missions-templates-safe.js.map +1 -0
  19. package/dist/extensions/missions-templates.d.ts +12 -0
  20. package/dist/extensions/missions-templates.js +26 -0
  21. package/dist/extensions/missions-templates.js.map +1 -0
  22. package/dist/extensions/missions.d.ts +27 -0
  23. package/dist/extensions/missions.js +81 -0
  24. package/dist/extensions/missions.js.map +1 -0
  25. package/dist/extensions/state.d.ts +89 -0
  26. package/dist/extensions/state.js +205 -0
  27. package/dist/extensions/state.js.map +1 -0
  28. package/dist/extensions/telemetry.d.ts +179 -0
  29. package/dist/extensions/telemetry.js +241 -0
  30. package/dist/extensions/telemetry.js.map +1 -0
  31. package/dist/extensions/wuxue-achievements.d.ts +27 -0
  32. package/dist/extensions/wuxue-achievements.js +92 -0
  33. package/dist/extensions/wuxue-achievements.js.map +1 -0
  34. package/dist/extensions/wuxue-boss.d.ts +15 -0
  35. package/dist/extensions/wuxue-boss.js +405 -0
  36. package/dist/extensions/wuxue-boss.js.map +1 -0
  37. package/dist/extensions/wuxue-data.d.ts +35 -0
  38. package/dist/extensions/wuxue-data.js +409 -0
  39. package/dist/extensions/wuxue-data.js.map +1 -0
  40. package/dist/extensions/wuxue-encounter.d.ts +23 -0
  41. package/dist/extensions/wuxue-encounter.js +368 -0
  42. package/dist/extensions/wuxue-encounter.js.map +1 -0
  43. package/dist/extensions/wuxue-faction.d.ts +43 -0
  44. package/dist/extensions/wuxue-faction.js +182 -0
  45. package/dist/extensions/wuxue-faction.js.map +1 -0
  46. package/dist/extensions/wuxue-profession.d.ts +33 -0
  47. package/dist/extensions/wuxue-profession.js +117 -0
  48. package/dist/extensions/wuxue-profession.js.map +1 -0
  49. package/dist/extensions/wuxue-talent.d.ts +41 -0
  50. package/dist/extensions/wuxue-talent.js +209 -0
  51. package/dist/extensions/wuxue-talent.js.map +1 -0
  52. package/dist/extensions/wuxue-types.d.ts +155 -0
  53. package/dist/extensions/wuxue-types.js +28 -0
  54. package/dist/extensions/wuxue-types.js.map +1 -0
  55. package/dist/extensions/wuxue.d.ts +89 -0
  56. package/dist/extensions/wuxue.js +441 -0
  57. package/dist/extensions/wuxue.js.map +1 -0
  58. package/dist/extensions/xia-boss.d.ts +14 -0
  59. package/dist/extensions/xia-boss.js +337 -0
  60. package/dist/extensions/xia-boss.js.map +1 -0
  61. package/dist/extensions/xia-cmd-faction.d.ts +4 -0
  62. package/dist/extensions/xia-cmd-faction.js +313 -0
  63. package/dist/extensions/xia-cmd-faction.js.map +1 -0
  64. package/dist/extensions/xia-cmd-missions.d.ts +4 -0
  65. package/dist/extensions/xia-cmd-missions.js +232 -0
  66. package/dist/extensions/xia-cmd-missions.js.map +1 -0
  67. package/dist/extensions/xia-cmd-shop-rank.d.ts +4 -0
  68. package/dist/extensions/xia-cmd-shop-rank.js +155 -0
  69. package/dist/extensions/xia-cmd-shop-rank.js.map +1 -0
  70. package/dist/extensions/xia-cmd-stats.d.ts +4 -0
  71. package/dist/extensions/xia-cmd-stats.js +290 -0
  72. package/dist/extensions/xia-cmd-stats.js.map +1 -0
  73. package/dist/extensions/xia-commands.d.ts +19 -0
  74. package/dist/extensions/xia-commands.js +138 -0
  75. package/dist/extensions/xia-commands.js.map +1 -0
  76. package/dist/extensions/xia-events.d.ts +58 -0
  77. package/dist/extensions/xia-events.js +615 -0
  78. package/dist/extensions/xia-events.js.map +1 -0
  79. package/dist/extensions/xia-render.d.ts +65 -0
  80. package/dist/extensions/xia-render.js +490 -0
  81. package/dist/extensions/xia-render.js.map +1 -0
  82. package/dist/extensions/xia-select.d.ts +24 -0
  83. package/dist/extensions/xia-select.js +413 -0
  84. package/dist/extensions/xia-select.js.map +1 -0
  85. package/dist/extensions/xia.d.ts +14 -0
  86. package/dist/extensions/xia.js +145 -0
  87. package/dist/extensions/xia.js.map +1 -0
  88. package/entry.js +18 -0
  89. package/package.json +61 -0
  90. package/skills/SKILL.md +83 -0
@@ -0,0 +1,241 @@
1
+ /**
2
+ * 遥测上传模块 v2 — Cloudflare D1 后端
3
+ *
4
+ * 零 API Key:客户端直接 fetch 到 Worker 公开端点。
5
+ * 当 telemetryEnabled = true 时,定期上传用户游戏数据到云端。
6
+ */
7
+ import { createPrivateKey, sign as cryptoSign } from "node:crypto";
8
+ import { calculateMBTIProfile as calcMBTI } from "./missions.js";
9
+ // ═══════════════════════════════════════════════════════════════════════════
10
+ // CONFIG
11
+ // ═══════════════════════════════════════════════════════════════════════════
12
+ // Worker URL — deploy 后替换为实际地址
13
+ const WORKER_URL = "https://xia.openclawd.qzz.io";
14
+ const UPLOAD_INTERVAL_MS = 60 * 1000; // 60 秒(客户端节流,服务端 MIN_REPORT_INTERVAL_SEC=30)
15
+ // ═══════════════════════════════════════════════════════════════════════════
16
+ // BUILD PAYLOAD
17
+ // ═══════════════════════════════════════════════════════════════════════════
18
+ /**
19
+ * 从 PetState 构建遥测上传数据
20
+ */
21
+ export function buildTelemetryPayload(state, getCharacter, getLevelTitle, packageVersion) {
22
+ if (!state.telemetryEnabled || !state.userId)
23
+ return null;
24
+ if (!state.SignPublicKey || !state.SignPrivateKey)
25
+ return null;
26
+ const char = state.characterId ? getCharacter(state.characterId) : null;
27
+ const payload = {
28
+ userId: state.userId,
29
+ characterId: state.characterId,
30
+ characterName: state.nickname || (char?.name ?? null),
31
+ level: state.wuxue.level,
32
+ title: getLevelTitle(state.wuxue.level),
33
+ gold: state.wuxue.gold,
34
+ totalXp: state.wuxue.totalXp,
35
+ totalEdits: state.wuxue.totalEdits,
36
+ totalCommands: state.wuxue.totalCommands,
37
+ totalTrainings: state.wuxue.totalTrainings,
38
+ martialSkills: JSON.stringify(state.martialSkills),
39
+ weapon: state.weapon,
40
+ achievements: JSON.stringify(state.wuxue.achievements),
41
+ bossesDefeated: state.wuxue.achievements?.length ?? 0,
42
+ createdAt: state.createdAt,
43
+ lastActiveAt: state.lastActiveAt,
44
+ reportedAt: Date.now(),
45
+ version: packageVersion,
46
+ publicKey: state.SignPublicKey,
47
+ signature: "", // placeholder, filled below
48
+ email: state.email,
49
+ mbtiType: null,
50
+ mbtiScores: null,
51
+ factionId: state.factionId ?? null,
52
+ factionContribution: state.factionContribution ?? 0,
53
+ professionId: state.professionId ?? null,
54
+ talents: JSON.stringify(state.talents ?? []),
55
+ talentPoints: state.talentPoints ?? 0,
56
+ };
57
+ // Compute MBTI from missions
58
+ const completedMissions = state.missions.filter(m => m.status === "completed" || m.status === "failed");
59
+ if (completedMissions.length > 0) {
60
+ try {
61
+ const profile = calcMBTI(completedMissions);
62
+ payload.mbtiType = profile.type;
63
+ payload.mbtiScores = JSON.stringify(profile.scores);
64
+ }
65
+ catch { /* non-critical */ }
66
+ }
67
+ // Sign: Ed25519(payload fields except signature)
68
+ const dataToSign = JSON.stringify({ ...payload, signature: "" });
69
+ const privateKey = createPrivateKey({
70
+ key: Buffer.from(state.SignPrivateKey, "base64"),
71
+ format: "der",
72
+ type: "pkcs8",
73
+ });
74
+ const sig = cryptoSign(null, Buffer.from(dataToSign), privateKey);
75
+ payload.signature = sig.toString("base64");
76
+ return payload;
77
+ }
78
+ // ═══════════════════════════════════════════════════════════════════════════
79
+ // UPLOAD
80
+ // ═══════════════════════════════════════════════════════════════════════════
81
+ let lastUploadTime = 0;
82
+ let uploadInProgress = false;
83
+ /**
84
+ * 从 state 恢复上次上传时间(重启后调用一次)
85
+ */
86
+ export function restoreLastUploadTime(state) {
87
+ if (state.lastTelemetryUpload && state.lastTelemetryUpload > lastUploadTime) {
88
+ lastUploadTime = state.lastTelemetryUpload;
89
+ }
90
+ }
91
+ /**
92
+ * 上传遥测数据到 Worker
93
+ */
94
+ export async function uploadTelemetry(payload) {
95
+ if (uploadInProgress)
96
+ return { ok: false, error: "upload in progress" };
97
+ uploadInProgress = true;
98
+ try {
99
+ const response = await fetch(`${WORKER_URL}/api/upload`, {
100
+ method: "POST",
101
+ headers: { "Content-Type": "application/json" },
102
+ body: JSON.stringify(payload),
103
+ signal: AbortSignal.timeout(10_000), // 10s timeout
104
+ });
105
+ const data = await response.json();
106
+ lastUploadTime = Date.now(); // 无论成功失败都更新,防止立刻重试
107
+ return data;
108
+ }
109
+ catch (err) {
110
+ lastUploadTime = Date.now();
111
+ return { ok: false, error: err.message ?? "network error" };
112
+ }
113
+ finally {
114
+ uploadInProgress = false;
115
+ }
116
+ }
117
+ /**
118
+ * 条件上传:检查间隔后自动上传
119
+ */
120
+ export async function maybeUpload(state, getCharacter, getLevelTitle, packageVersion) {
121
+ if (!state.telemetryEnabled)
122
+ return { ok: false };
123
+ // 初始化恢复(重启后首次调用时)
124
+ if (state.lastTelemetryUpload && state.lastTelemetryUpload > lastUploadTime) {
125
+ lastUploadTime = state.lastTelemetryUpload;
126
+ }
127
+ const now = Date.now();
128
+ // 客户端节流:距上次上传必须超过 UPLOAD_INTERVAL_MS
129
+ if (now - lastUploadTime < UPLOAD_INTERVAL_MS)
130
+ return { ok: false };
131
+ const payload = buildTelemetryPayload(state, getCharacter, getLevelTitle, packageVersion);
132
+ if (!payload)
133
+ return { ok: false };
134
+ const result = await uploadTelemetry(payload);
135
+ // 持久化上传时间到 state
136
+ state.lastTelemetryUpload = lastUploadTime;
137
+ return result;
138
+ }
139
+ // ═══════════════════════════════════════════════════════════════════════════
140
+ // FETCH PUBLIC DATA (排行榜等)
141
+ // ═══════════════════════════════════════════════════════════════════════════
142
+ /**
143
+ * 获取排行榜
144
+ */
145
+ export async function fetchLeaderboard(sort = "level", limit = 20, offset = 0) {
146
+ try {
147
+ const url = `${WORKER_URL}/api/leaderboard?sort=${sort}&limit=${limit}&offset=${offset}`;
148
+ const response = await fetch(url, { signal: AbortSignal.timeout(10_000) });
149
+ return await response.json();
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ }
155
+ /**
156
+ * 获取 MBTI 性格匹配的真人玩家
157
+ */
158
+ export async function fetchMatch(userId) {
159
+ try {
160
+ const response = await fetch(`${WORKER_URL}/api/match/${userId}`, { signal: AbortSignal.timeout(10_000) });
161
+ return await response.json();
162
+ }
163
+ catch {
164
+ return null;
165
+ }
166
+ }
167
+ /**
168
+ * 获取某玩家详情 + 排名
169
+ */
170
+ export async function fetchPlayerProfile(userId) {
171
+ try {
172
+ const response = await fetch(`${WORKER_URL}/api/player/${userId}`, { signal: AbortSignal.timeout(10_000) });
173
+ return await response.json();
174
+ }
175
+ catch {
176
+ return null;
177
+ }
178
+ }
179
+ /**
180
+ * 获取全局统计
181
+ */
182
+ export async function fetchGlobalStats() {
183
+ try {
184
+ const response = await fetch(`${WORKER_URL}/api/stats`, { signal: AbortSignal.timeout(10_000) });
185
+ return await response.json();
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ /**
192
+ * 服务端生成遭遇 — 客户端不再本地生成
193
+ */
194
+ export async function serverEncounter(userId, level, weaponAtk, currentHp, maxHp) {
195
+ try {
196
+ const response = await fetch(`${WORKER_URL}/api/encounter`, {
197
+ method: "POST",
198
+ headers: { "Content-Type": "application/json" },
199
+ body: JSON.stringify({ userId, level, weaponAtk, currentHp, maxHp }),
200
+ signal: AbortSignal.timeout(15_000),
201
+ });
202
+ const data = await response.json();
203
+ return data.ok ? data : null;
204
+ }
205
+ catch {
206
+ // 网络失败时回退到本地生成(降级模式)
207
+ return null;
208
+ }
209
+ }
210
+ /**
211
+ * 服务端 Boss 战斗 — 客户端不再本地计算
212
+ */
213
+ export async function serverBossFight(userId, level, weaponAtk, weaponElement, skillLevel, skillElement, bossId) {
214
+ try {
215
+ const response = await fetch(`${WORKER_URL}/api/boss-fight`, {
216
+ method: "POST",
217
+ headers: { "Content-Type": "application/json" },
218
+ body: JSON.stringify({ userId, level, weaponAtk, weaponElement, skillLevel, skillElement: skillElement || "", bossId }),
219
+ signal: AbortSignal.timeout(15_000),
220
+ });
221
+ const data = await response.json();
222
+ return data.ok ? data : null;
223
+ }
224
+ catch {
225
+ // 网络失败时回退到本地计算(降级模式)
226
+ return null;
227
+ }
228
+ }
229
+ /**
230
+ * 获取公开配置(显示用途)
231
+ */
232
+ export async function fetchPublicConfig() {
233
+ try {
234
+ const response = await fetch(`${WORKER_URL}/api/config/public`, { signal: AbortSignal.timeout(10_000) });
235
+ return await response.json();
236
+ }
237
+ catch {
238
+ return null;
239
+ }
240
+ }
241
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../extensions/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * wuxue-achievements.ts — 成就定义 + 成就图片生成
3
+ * 成就分为多个类别,每个成就可生成 PNG 徽章图片
4
+ */
5
+ export interface AchievementCategory {
6
+ id: string;
7
+ name: string;
8
+ emoji: string;
9
+ color: string;
10
+ }
11
+ export declare const ACHIEVEMENT_CATEGORIES: AchievementCategory[];
12
+ export interface AchievementDef {
13
+ id: string;
14
+ name: string;
15
+ description: string;
16
+ category: string;
17
+ icon: string;
18
+ rarity: "common" | "rare" | "epic" | "legendary";
19
+ check?: (state: any) => boolean;
20
+ }
21
+ export declare const ACHIEVEMENT_DEFS: AchievementDef[];
22
+ export declare function getAchievementDef(id: string): AchievementDef | undefined;
23
+ export declare function getAllAchievementDefs(): AchievementDef[];
24
+ export declare function getAchievementsByCategory(category: string): AchievementDef[];
25
+ export declare function getRarityLabel(rarity: AchievementDef["rarity"]): string;
26
+ export declare function getRarityColor(rarity: AchievementDef["rarity"]): string;
27
+ export declare function getRarityEmoji(rarity: AchievementDef["rarity"]): string;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * wuxue-achievements.ts — 成就定义 + 成就图片生成
3
+ * 成就分为多个类别,每个成就可生成 PNG 徽章图片
4
+ */
5
+ export const ACHIEVEMENT_CATEGORIES = [
6
+ { id: "training", name: "修炼", emoji: "🏋️", color: "#4A90D9" },
7
+ { id: "level", name: "等级", emoji: "⬆️", color: "#7B68EE" },
8
+ { id: "skill", name: "武功", emoji: "武术", color: "#E67E22" },
9
+ { id: "battle", name: "战斗", emoji: "⚔️", color: "#E74C3C" },
10
+ { id: "wealth", name: "财富", emoji: "💰", color: "#F1C40F" },
11
+ { id: "jianghu", name: "江湖", emoji: "🌏", color: "#2ECC71" },
12
+ { id: "mission", name: "任务", emoji: "📋", color: "#9B59B6" },
13
+ { id: "item", name: "道具", emoji: "🎁", color: "#1ABC9C" },
14
+ ];
15
+ export const ACHIEVEMENT_DEFS = [
16
+ // ── 修炼类 ──
17
+ { id: "first_train", name: "初入江湖", description: "第一次修炼", category: "training", icon: "🌱", rarity: "common" },
18
+ { id: "train_10", name: "勤学苦练", description: "修炼10次", category: "training", icon: "📖", rarity: "common" },
19
+ { id: "train_50", name: "精益求精", description: "修炼50次", category: "training", icon: "📚", rarity: "rare" },
20
+ { id: "train_100", name: "百炼成钢", description: "修炼100次", category: "training", icon: "⚒️", rarity: "rare" },
21
+ { id: "train_500", name: "修仙之路", description: "修炼500次", category: "training", icon: "🧙", rarity: "epic" },
22
+ { id: "train_1000", name: "大道至简", description: "修炼1000次", category: "training", icon: "☯️", rarity: "legendary" },
23
+ // ── 等级类 ──
24
+ { id: "level_5", name: "初出茅庐", description: "达到5级", category: "level", icon: "🌟", rarity: "common" },
25
+ { id: "level_10", name: "小有名气", description: "达到10级", category: "level", icon: "⭐", rarity: "common" },
26
+ { id: "level_30", name: "声名远播", description: "达到30级", category: "level", icon: "💫", rarity: "rare" },
27
+ { id: "level_50", name: "名震四方", description: "达到50级", category: "level", icon: "🏅", rarity: "rare" },
28
+ { id: "level_80", name: "登峰造极", description: "达到80级", category: "level", icon: "🏆", rarity: "epic" },
29
+ { id: "level_100", name: "武林至尊", description: "达到100级", category: "level", icon: "👑", rarity: "legendary" },
30
+ // ── 武功类 ──
31
+ { id: "skill_first", name: "初窥门径", description: "习得第一门武功", category: "skill", icon: "📜", rarity: "common" },
32
+ { id: "skill_master_5", name: "武功小成", description: "武功达到5级", category: "skill", icon: "🎯", rarity: "common" },
33
+ { id: "skill_master_8", name: "武功大成", description: "武功达到8级", category: "skill", icon: "🔥", rarity: "rare" },
34
+ { id: "skill_master_10", name: "登堂入室", description: "武功达到10级", category: "skill", icon: "⚡", rarity: "rare" },
35
+ { id: "element_master", name: "五行通晓", description: "拥有3种以上不同元素武功", category: "skill", icon: "🎨", rarity: "epic" },
36
+ { id: "all_elements", name: "五行俱全", description: "拥有金木水火土五行武功", category: "skill", icon: "🌈", rarity: "legendary" },
37
+ // ── 战斗类 ──
38
+ { id: "boss_first", name: "初战告捷", description: "第一次击败Boss", category: "battle", icon: "⚔️", rarity: "common" },
39
+ { id: "boss_10", name: "战无不胜", description: "击败10个Boss", category: "battle", icon: "🗡️", rarity: "common" },
40
+ { id: "boss_50", name: "百战百胜", description: "击败50个Boss", category: "battle", icon: "💪", rarity: "rare" },
41
+ { id: "boss_100", name: "杀神", description: "击败100个Boss", category: "battle", icon: "💀", rarity: "epic" },
42
+ { id: "boss_streak_5", name: "连战连捷", description: "连续击败5个Boss", category: "battle", icon: "🔥", rarity: "rare" },
43
+ { id: "boss_perfect", name: "完美无缺", description: "无伤击败Boss", category: "battle", icon: "✨", rarity: "epic" },
44
+ { id: "boss_one_shot", name: "一击必杀", description: "一回合击败Boss", category: "battle", icon: "⚡", rarity: "legendary" },
45
+ // ── 财富类 ──
46
+ { id: "gold_100", name: "初涉商海", description: "拥有100金币", category: "wealth", icon: "🪙", rarity: "common" },
47
+ { id: "gold_1000", name: "小有积蓄", description: "拥有1000金币", category: "wealth", icon: "💰", rarity: "common" },
48
+ { id: "gold_10000", name: "富甲一方", description: "拥有10000金币", category: "wealth", icon: "💎", rarity: "rare" },
49
+ { id: "gold_100000", name: "富可敌国", description: "拥有100000金币", category: "wealth", icon: "🏦", rarity: "legendary" },
50
+ { id: "shop_first", name: "初次购物", description: "第一次在商铺购买", category: "wealth", icon: "🛒", rarity: "common" },
51
+ { id: "shop_50", name: "老主顾", description: "商铺购买50次", category: "wealth", icon: "🏪", rarity: "rare" },
52
+ // ── 江湖类 ──
53
+ { id: "encounter_50", name: "行走江湖", description: "遭遇50次江湖事件", category: "jianghu", icon: "🌏", rarity: "common" },
54
+ { id: "encounter_500", name: "浪迹天涯", description: "遭遇500次江湖事件", category: "jianghu", icon: "🗺️", rarity: "rare" },
55
+ { id: "command_100", name: "命令达人", description: "执行100条命令", category: "jianghu", icon: "⌨️", rarity: "common" },
56
+ { id: "command_500", name: "命令大师", description: "执行500条命令", category: "jianghu", icon: "🏅", rarity: "rare" },
57
+ { id: "edit_100", name: "笔耕不辍", description: "编辑100次", category: "jianghu", icon: "📝", rarity: "common" },
58
+ { id: "edit_1000", name: "著作等身", description: "编辑1000次", category: "jianghu", icon: "📚", rarity: "epic" },
59
+ // ── 任务类 ──
60
+ { id: "mission_first", name: "初领任务", description: "完成第一个任务", category: "mission", icon: "📋", rarity: "common" },
61
+ { id: "mission_10", name: "任务达人", description: "完成10个任务", category: "mission", icon: "✅", rarity: "common" },
62
+ { id: "mission_50", name: "使命必达", description: "完成50个任务", category: "mission", icon: "🎖️", rarity: "rare" },
63
+ { id: "mission_100", name: "功成名就", description: "完成100个任务", category: "mission", icon: "🏆", rarity: "epic" },
64
+ { id: "mission_streak_5", name: "连战连胜", description: "连续完成5个任务", category: "mission", icon: "🔥", rarity: "rare" },
65
+ { id: "extreme_risk", name: "虎口拔牙", description: "完成极限风险任务", category: "mission", icon: "☠️", rarity: "epic" },
66
+ // ── 道具类 ──
67
+ { id: "first_weapon", name: "初获兵器", description: "获得第一把武器", category: "item", icon: "🗡️", rarity: "common" },
68
+ { id: "weapon_rare", name: "良兵入手", description: "获得良品武器", category: "item", icon: "⚔️", rarity: "common" },
69
+ { id: "weapon_epic", name: "神兵利器", description: "获得极品武器", category: "item", icon: "🔱", rarity: "rare" },
70
+ { id: "weapon_legendary", name: "绝世神兵", description: "获得神器", category: "item", icon: "💎", rarity: "legendary" },
71
+ { id: "item_50", name: "道具收藏家", description: "使用50个道具", category: "item", icon: "🎁", rarity: "rare" },
72
+ ];
73
+ const ACHIEVEMENT_MAP = new Map(ACHIEVEMENT_DEFS.map(a => [a.id, a]));
74
+ export function getAchievementDef(id) {
75
+ return ACHIEVEMENT_MAP.get(id);
76
+ }
77
+ export function getAllAchievementDefs() {
78
+ return ACHIEVEMENT_DEFS;
79
+ }
80
+ export function getAchievementsByCategory(category) {
81
+ return ACHIEVEMENT_DEFS.filter(a => a.category === category);
82
+ }
83
+ export function getRarityLabel(rarity) {
84
+ return rarity === "common" ? "普通" : rarity === "rare" ? "稀有" : rarity === "epic" ? "史诗" : "传说";
85
+ }
86
+ export function getRarityColor(rarity) {
87
+ return rarity === "common" ? "#9E9E9E" : rarity === "rare" ? "#2196F3" : rarity === "epic" ? "#9C27B0" : "#FF9800";
88
+ }
89
+ export function getRarityEmoji(rarity) {
90
+ return rarity === "common" ? "⬜" : rarity === "rare" ? "🟦" : rarity === "epic" ? "🟪" : "🟧";
91
+ }
92
+ //# sourceMappingURL=wuxue-achievements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wuxue-achievements.js","sourceRoot":"","sources":["../../extensions/wuxue-achievements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 武功系统 - Boss 定义与战斗
3
+ */
4
+ import type { Element, BossDef, BattleResult, BattleState, TurnAction, TurnResult, DiceEvent, WuxueState } from "./wuxue-types.js";
5
+ export declare const BOSS_DEFS: BossDef[];
6
+ export declare function getBossForLevel(level: number): BossDef;
7
+ export declare function fightBoss(state: WuxueState, weaponAttack: number, weaponElement: Element, boss: BossDef, skillLevel?: number, skillElement?: Element): BattleResult;
8
+ /** 初始化手动战斗状态 */
9
+ export declare function initBattleState(state: WuxueState, weaponAttack: number, weaponElement: Element, boss: BossDef, skillLevel?: number, skillElement?: Element): BattleState;
10
+ /** 执行一回合手动战斗 */
11
+ /** 掷骰并产生随机事件 */
12
+ export declare function rollDice(playerElement: Element, bossElement: Element): DiceEvent;
13
+ export declare function executeBattleTurn(bs: BattleState, action: TurnAction, elementMultiplier: (a: Element, d: Element) => number): TurnResult;
14
+ /** 手动战斗结束后,结算奖励到 state */
15
+ export declare function finalizeBattle(state: WuxueState, bs: BattleState, boss: BossDef, won: boolean, fled: boolean): BattleResult;