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.
- package/LICENSE +21 -0
- package/README.md +378 -0
- package/dist/assets/portrait-ascii/portrait-data.json +1 -0
- package/dist/extensions/characters.d.ts +19 -0
- package/dist/extensions/characters.js +52 -0
- package/dist/extensions/characters.js.map +1 -0
- package/dist/extensions/index.d.ts +1 -0
- package/dist/extensions/index.js +20 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/missions-mbti.d.ts +39 -0
- package/dist/extensions/missions-mbti.js +101 -0
- package/dist/extensions/missions-mbti.js.map +1 -0
- package/dist/extensions/missions-templates-danger.d.ts +5 -0
- package/dist/extensions/missions-templates-danger.js +432 -0
- package/dist/extensions/missions-templates-danger.js.map +1 -0
- package/dist/extensions/missions-templates-safe.d.ts +34 -0
- package/dist/extensions/missions-templates-safe.js +307 -0
- package/dist/extensions/missions-templates-safe.js.map +1 -0
- package/dist/extensions/missions-templates.d.ts +12 -0
- package/dist/extensions/missions-templates.js +26 -0
- package/dist/extensions/missions-templates.js.map +1 -0
- package/dist/extensions/missions.d.ts +27 -0
- package/dist/extensions/missions.js +81 -0
- package/dist/extensions/missions.js.map +1 -0
- package/dist/extensions/state.d.ts +89 -0
- package/dist/extensions/state.js +205 -0
- package/dist/extensions/state.js.map +1 -0
- package/dist/extensions/telemetry.d.ts +179 -0
- package/dist/extensions/telemetry.js +241 -0
- package/dist/extensions/telemetry.js.map +1 -0
- package/dist/extensions/wuxue-achievements.d.ts +27 -0
- package/dist/extensions/wuxue-achievements.js +92 -0
- package/dist/extensions/wuxue-achievements.js.map +1 -0
- package/dist/extensions/wuxue-boss.d.ts +15 -0
- package/dist/extensions/wuxue-boss.js +405 -0
- package/dist/extensions/wuxue-boss.js.map +1 -0
- package/dist/extensions/wuxue-data.d.ts +35 -0
- package/dist/extensions/wuxue-data.js +409 -0
- package/dist/extensions/wuxue-data.js.map +1 -0
- package/dist/extensions/wuxue-encounter.d.ts +23 -0
- package/dist/extensions/wuxue-encounter.js +368 -0
- package/dist/extensions/wuxue-encounter.js.map +1 -0
- package/dist/extensions/wuxue-faction.d.ts +43 -0
- package/dist/extensions/wuxue-faction.js +182 -0
- package/dist/extensions/wuxue-faction.js.map +1 -0
- package/dist/extensions/wuxue-profession.d.ts +33 -0
- package/dist/extensions/wuxue-profession.js +117 -0
- package/dist/extensions/wuxue-profession.js.map +1 -0
- package/dist/extensions/wuxue-talent.d.ts +41 -0
- package/dist/extensions/wuxue-talent.js +209 -0
- package/dist/extensions/wuxue-talent.js.map +1 -0
- package/dist/extensions/wuxue-types.d.ts +155 -0
- package/dist/extensions/wuxue-types.js +28 -0
- package/dist/extensions/wuxue-types.js.map +1 -0
- package/dist/extensions/wuxue.d.ts +89 -0
- package/dist/extensions/wuxue.js +441 -0
- package/dist/extensions/wuxue.js.map +1 -0
- package/dist/extensions/xia-boss.d.ts +14 -0
- package/dist/extensions/xia-boss.js +337 -0
- package/dist/extensions/xia-boss.js.map +1 -0
- package/dist/extensions/xia-cmd-faction.d.ts +4 -0
- package/dist/extensions/xia-cmd-faction.js +313 -0
- package/dist/extensions/xia-cmd-faction.js.map +1 -0
- package/dist/extensions/xia-cmd-missions.d.ts +4 -0
- package/dist/extensions/xia-cmd-missions.js +232 -0
- package/dist/extensions/xia-cmd-missions.js.map +1 -0
- package/dist/extensions/xia-cmd-shop-rank.d.ts +4 -0
- package/dist/extensions/xia-cmd-shop-rank.js +155 -0
- package/dist/extensions/xia-cmd-shop-rank.js.map +1 -0
- package/dist/extensions/xia-cmd-stats.d.ts +4 -0
- package/dist/extensions/xia-cmd-stats.js +290 -0
- package/dist/extensions/xia-cmd-stats.js.map +1 -0
- package/dist/extensions/xia-commands.d.ts +19 -0
- package/dist/extensions/xia-commands.js +138 -0
- package/dist/extensions/xia-commands.js.map +1 -0
- package/dist/extensions/xia-events.d.ts +58 -0
- package/dist/extensions/xia-events.js +615 -0
- package/dist/extensions/xia-events.js.map +1 -0
- package/dist/extensions/xia-render.d.ts +65 -0
- package/dist/extensions/xia-render.js +490 -0
- package/dist/extensions/xia-render.js.map +1 -0
- package/dist/extensions/xia-select.d.ts +24 -0
- package/dist/extensions/xia-select.js +413 -0
- package/dist/extensions/xia-select.js.map +1 -0
- package/dist/extensions/xia.d.ts +14 -0
- package/dist/extensions/xia.js +145 -0
- package/dist/extensions/xia.js.map +1 -0
- package/entry.js +18 -0
- package/package.json +61 -0
- 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;
|