koishi-plugin-satori-ai 1.3.3 → 1.3.4
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/lib/gameOneTouch.d.ts +8 -8
- package/lib/index.js +270 -53
- package/package.json +1 -1
package/lib/gameOneTouch.d.ts
CHANGED
|
@@ -3,8 +3,7 @@ import { abstractGame, abstractGameSingleGame, gameResult } from './abstractGame
|
|
|
3
3
|
import { winFlag } from './game';
|
|
4
4
|
export interface OneTouchResult extends gameResult {
|
|
5
5
|
win: winFlag;
|
|
6
|
-
|
|
7
|
-
playerId: number;
|
|
6
|
+
bonus: number;
|
|
8
7
|
}
|
|
9
8
|
declare class OneTouchSingleGame extends abstractGameSingleGame {
|
|
10
9
|
private player;
|
|
@@ -16,20 +15,21 @@ declare class OneTouchSingleGame extends abstractGameSingleGame {
|
|
|
16
15
|
private playerLevelHP;
|
|
17
16
|
private aiLevelHp;
|
|
18
17
|
private lastScore;
|
|
18
|
+
private bonus;
|
|
19
|
+
private singleBonus;
|
|
20
|
+
private singleBonusMultiplier;
|
|
21
|
+
private comboCombos;
|
|
19
22
|
constructor(disposeListener: () => boolean, session: Session);
|
|
20
23
|
startGame(): Promise<string>;
|
|
21
|
-
endGame: () => Promise<
|
|
22
|
-
message: string;
|
|
23
|
-
win: winFlag;
|
|
24
|
-
gameName: string;
|
|
25
|
-
playerID: string;
|
|
26
|
-
}>;
|
|
24
|
+
endGame: () => Promise<OneTouchResult>;
|
|
27
25
|
private initState;
|
|
28
26
|
processInput(input: string): Promise<string>;
|
|
29
27
|
private buildTurnResult;
|
|
30
28
|
private judgeEnd;
|
|
31
29
|
private processPlayerTurn;
|
|
30
|
+
private buildMyTurnBonusMessage;
|
|
32
31
|
private processAiTurn;
|
|
32
|
+
private buildAiTurnBonusMessage;
|
|
33
33
|
private applyEffectToEnemy;
|
|
34
34
|
private applyEffectToSelf;
|
|
35
35
|
private checkCombo;
|
package/lib/index.js
CHANGED
|
@@ -474,7 +474,7 @@ var APIClient = class {
|
|
|
474
474
|
continue;
|
|
475
475
|
}
|
|
476
476
|
}
|
|
477
|
-
return { content: "
|
|
477
|
+
return { content: "unreachable", error: true };
|
|
478
478
|
}
|
|
479
479
|
// 生成请求头
|
|
480
480
|
createHeaders(keys) {
|
|
@@ -2171,17 +2171,27 @@ var import_koishi11 = require("koishi");
|
|
|
2171
2171
|
var logger10 = new import_koishi11.Logger("satori-game-onetouch");
|
|
2172
2172
|
var SKILL_MAP = {
|
|
2173
2173
|
// 基础技能
|
|
2174
|
-
"-1": {
|
|
2174
|
+
"-1": { name: "无效" },
|
|
2175
2175
|
"1": { pierceDamage: 1, bleed: 3, name: "锥刺" },
|
|
2176
|
+
//特性:流血
|
|
2176
2177
|
"2": { pierceDamage: 1, stun: true, name: "点穴" },
|
|
2178
|
+
//特性:眩晕
|
|
2177
2179
|
"3": { damage: 6, counterAttack: 3, name: "爪击" },
|
|
2180
|
+
//特性:反击
|
|
2178
2181
|
"4": { shield: 1, name: "护盾" },
|
|
2182
|
+
//特性:护盾
|
|
2179
2183
|
"5": { damage: 4, weakStun: true, name: "巴掌" },
|
|
2184
|
+
//特性:普通伤害+弱眩晕
|
|
2180
2185
|
"6": { heal: 6, selfbleed: -2, name: "酒" },
|
|
2186
|
+
//特性:回血
|
|
2181
2187
|
"7": { pierceDamage: 1, destroyShield: 2, name: "钻击" },
|
|
2188
|
+
//特性:破盾
|
|
2182
2189
|
"8": { damage: 13, selfStun: true, name: "枪击" },
|
|
2190
|
+
//特性:高伤+自眩晕
|
|
2183
2191
|
"9": { pierceDamage: 1, bleed: 2, strengthChange: -1, name: "钩" },
|
|
2192
|
+
//特性:削弱
|
|
2184
2193
|
"0": { selfstrengthChange: 2, name: "蓄力" },
|
|
2194
|
+
//特性:蓄力
|
|
2185
2195
|
// 组合技
|
|
2186
2196
|
"1+8": { damage: 15, bleed: 3, selfStun: true, name: "空尖弹" },
|
|
2187
2197
|
"5+5": { damage: 5, stun: true, name: "镇压" },
|
|
@@ -2199,6 +2209,7 @@ var SKILL_MAP = {
|
|
|
2199
2209
|
"7+8": { pierceDamage: 13, destroyShield: 3, selfStun: true, name: "穿甲弹" },
|
|
2200
2210
|
"2+6": { damage: 5, heal: 6, selfbleed: -1, selfstrengthChange: 1, stun: true, name: "点辰" },
|
|
2201
2211
|
"3+7": { name: "混沌", counterAttack: 7, destroyShield: 2, addLeft: 9, addRight: 1 },
|
|
2212
|
+
"0+9": { name: "将大局逆转吧", revwersalOfStrength: true },
|
|
2202
2213
|
"0+0": { name: "华丽收场", bleed: 5, selfstrengthChange: -99, magnificentEnd: true }
|
|
2203
2214
|
};
|
|
2204
2215
|
var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
@@ -2220,12 +2231,22 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2220
2231
|
// AI每级增加的血量
|
|
2221
2232
|
lastScore = 0;
|
|
2222
2233
|
// 上一回合的分数
|
|
2234
|
+
bonus = 0;
|
|
2235
|
+
// 奖励分数
|
|
2236
|
+
singleBonus = 0;
|
|
2237
|
+
// 单回合的分数
|
|
2238
|
+
singleBonusMultiplier = 1;
|
|
2239
|
+
// 单回合的分数倍率
|
|
2240
|
+
comboCombos = 0;
|
|
2241
|
+
// 组合技连击次数
|
|
2223
2242
|
constructor(disposeListener, session) {
|
|
2224
2243
|
super(disposeListener, session);
|
|
2225
2244
|
}
|
|
2226
2245
|
async startGame() {
|
|
2227
2246
|
super.startGame();
|
|
2228
2247
|
this.turnCount = 0;
|
|
2248
|
+
this.bonus = 0;
|
|
2249
|
+
this.comboCombos = 0;
|
|
2229
2250
|
this.player = {
|
|
2230
2251
|
left: Math.round(Math.random() * 8) + 1,
|
|
2231
2252
|
right: Math.round(Math.random() * 8) + 1,
|
|
@@ -2249,16 +2270,25 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2249
2270
|
}
|
|
2250
2271
|
// 结束游戏,返回结果
|
|
2251
2272
|
endGame = async () => {
|
|
2273
|
+
if (this.winningFlag === 4 /* pending */ || this.winningFlag === 2 /* lose */) {
|
|
2274
|
+
this.bonus = Math.abs(Math.floor(this.level * 0.2 * this.bonus));
|
|
2275
|
+
this.bonus -= Math.floor(this.level * this.level * (Math.random() * 2 + 2) + 200);
|
|
2276
|
+
this.bonus = Math.min(this.bonus, 0);
|
|
2277
|
+
}
|
|
2278
|
+
if (this.winningFlag === 1 /* win */) {
|
|
2279
|
+
this.bonus = Math.floor(this.level * this.bonus * 0.2 * (Math.random() * 1 + 1));
|
|
2280
|
+
}
|
|
2281
|
+
const finalBonus = this.bonus;
|
|
2252
2282
|
super.endGame();
|
|
2253
|
-
return {
|
|
2283
|
+
return { win: this.winningFlag, gameName: "一碰一", playerID: this.session.userId, bonus: finalBonus, message: this.level.toString() };
|
|
2254
2284
|
};
|
|
2255
2285
|
initState(level) {
|
|
2256
2286
|
this.player = {
|
|
2257
2287
|
left: this.player.left,
|
|
2258
2288
|
right: this.player.right,
|
|
2259
2289
|
hp: this.baseHP + level * this.playerLevelHP,
|
|
2260
|
-
shield: Math.round(level /
|
|
2261
|
-
strength:
|
|
2290
|
+
shield: Math.round(level / 2),
|
|
2291
|
+
strength: 0,
|
|
2262
2292
|
bleed: 0,
|
|
2263
2293
|
counterAttack: 0,
|
|
2264
2294
|
vulnerablility: 0,
|
|
@@ -2282,17 +2312,17 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2282
2312
|
if (this.turnCount === 0)
|
|
2283
2313
|
this.initState(this.level);
|
|
2284
2314
|
this.turnCount++;
|
|
2285
|
-
if (this.winningFlag !== 4 /* pending */)
|
|
2286
|
-
return "游戏已结束";
|
|
2287
2315
|
const [handA, handB] = input.split(" ");
|
|
2288
2316
|
if (handA !== "左" && handA !== "右" || handB !== "左" && handB !== "右")
|
|
2289
2317
|
return;
|
|
2318
|
+
if (this.winningFlag !== 4 /* pending */)
|
|
2319
|
+
return "游戏已结束";
|
|
2290
2320
|
const numberA = this.player[handA === "左" ? "left" : "right"];
|
|
2291
2321
|
const numberB = this.ai[handB === "左" ? "left" : "right"];
|
|
2292
2322
|
const result = this.processPlayerTurn(numberA, numberB);
|
|
2293
2323
|
const bestMove = this.ai.status === 1 /* Stunned */ ? [0, 0] : this.aiSearchEntrance();
|
|
2294
2324
|
const aiResult = this.processAiTurn(bestMove[0], bestMove[1]);
|
|
2295
|
-
if (this.player.status === 1 /* Stunned */)
|
|
2325
|
+
if (this.player.status === 1 /* Stunned */ && this.player.hp > 0 && this.ai.hp > 0)
|
|
2296
2326
|
setTimeout(async () => {
|
|
2297
2327
|
this.session.send(await this.processInput(input));
|
|
2298
2328
|
}, 1e3);
|
|
@@ -2302,7 +2332,7 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2302
2332
|
const createStatusBar = /* @__PURE__ */ __name((value, max, width) => `[${"■".repeat(Math.max(Math.ceil(value / max * width), 0))}${"□".repeat(width - Math.max(Math.ceil(value / max * width)))}]`, "createStatusBar");
|
|
2303
2333
|
const statusIcon = /* @__PURE__ */ __name((value, icon) => value != 0 ? `${icon}×${value}` : "", "statusIcon");
|
|
2304
2334
|
const aiStatusDisplay = [
|
|
2305
|
-
`❤️${createStatusBar(this.ai.hp, Math.max(this.baseHP + this.level * this.aiLevelHp, this.ai.hp), Math.round(this.baseHP /
|
|
2335
|
+
`❤️${createStatusBar(this.ai.hp, Math.max(this.baseHP + this.level * this.aiLevelHp, this.ai.hp), Math.round(this.baseHP / 8 + this.level * this.aiLevelHp / this.playerLevelHP))} ${this.ai.hp}HP`,
|
|
2306
2336
|
`🛡️${this.ai.shield}`,
|
|
2307
2337
|
statusIcon(this.ai.bleed, "🩸"),
|
|
2308
2338
|
statusIcon(this.ai.strength, "💪"),
|
|
@@ -2311,7 +2341,7 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2311
2341
|
this.ai.status === 1 /* Stunned */ ? "💫 眩晕" : ""
|
|
2312
2342
|
].filter(Boolean).join(" | ");
|
|
2313
2343
|
const playerStatusDisplay = [
|
|
2314
|
-
`❤️${createStatusBar(this.player.hp, Math.max(this.baseHP + this.level * this.playerLevelHP, this.player.hp), Math.round(this.baseHP /
|
|
2344
|
+
`❤️${createStatusBar(this.player.hp, Math.max(this.baseHP + this.level * this.playerLevelHP, this.player.hp), Math.round(this.baseHP / 8 + this.level))} ${this.player.hp}HP`,
|
|
2315
2345
|
`🛡️${this.player.shield}`,
|
|
2316
2346
|
statusIcon(this.player.bleed, "🩸"),
|
|
2317
2347
|
statusIcon(this.player.strength, "💪"),
|
|
@@ -2319,9 +2349,9 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2319
2349
|
statusIcon(this.player.vulnerablility, "💔"),
|
|
2320
2350
|
this.player.status === 1 /* Stunned */ ? "💫 眩晕" : ""
|
|
2321
2351
|
].filter(Boolean).join(" | ");
|
|
2322
|
-
return wrapInHTML2(
|
|
2352
|
+
return wrapInHTML2(`▶️你的行动:${result}
|
|
2323
2353
|
|
|
2324
|
-
|
|
2354
|
+
▶️我的行动:${aiResult}
|
|
2325
2355
|
|
|
2326
2356
|
我的当前手势:左${this.ai.left} 右${this.ai.right}
|
|
2327
2357
|
你的当前手势:左${this.player.left} 右${this.player.right}
|
|
@@ -2339,12 +2369,10 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2339
2369
|
judgeEnd() {
|
|
2340
2370
|
if (this.ai.hp <= 0) {
|
|
2341
2371
|
this.winningFlag = 1 /* win */;
|
|
2342
|
-
this.endGame();
|
|
2343
2372
|
return `你赢了!发送结束游戏退出`;
|
|
2344
2373
|
}
|
|
2345
2374
|
if (this.player.hp <= 0) {
|
|
2346
2375
|
this.winningFlag = 2 /* lose */;
|
|
2347
|
-
this.endGame();
|
|
2348
2376
|
return `你输了!发送结束游戏退出`;
|
|
2349
2377
|
}
|
|
2350
2378
|
}
|
|
@@ -2357,32 +2385,141 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2357
2385
|
this.player = this.applyEffectToSelf(this.ai, this.player, SKILL_MAP["-1"]);
|
|
2358
2386
|
return "你被眩晕,跳过回合";
|
|
2359
2387
|
}
|
|
2360
|
-
const playerState = this.player;
|
|
2361
|
-
const aiState = this.ai;
|
|
2362
2388
|
const sum = (handA + handB) % 10;
|
|
2363
|
-
this.player[handA ===
|
|
2389
|
+
this.player[handA === this.player.left ? "left" : "right"] = sum;
|
|
2364
2390
|
let effect = SKILL_MAP[sum.toString()] || {};
|
|
2365
2391
|
let isCombo = false;
|
|
2366
2392
|
const combo = this.checkCombo(this.player["left"], this.player["right"]);
|
|
2367
2393
|
if (combo) {
|
|
2368
2394
|
isCombo = true;
|
|
2395
|
+
this.comboCombos++;
|
|
2369
2396
|
effect = { ...combo };
|
|
2397
|
+
} else {
|
|
2398
|
+
this.comboCombos = 0;
|
|
2370
2399
|
}
|
|
2400
|
+
const bonusMessage = this.buildMyTurnBonusMessage(effect, isCombo);
|
|
2401
|
+
const playerState = this.player;
|
|
2402
|
+
const aiState = this.ai;
|
|
2371
2403
|
this.ai = this.applyEffectToEnemy(playerState, aiState, effect, !!combo);
|
|
2372
2404
|
this.player = this.applyEffectToSelf(aiState, playerState, effect);
|
|
2373
|
-
return this.buildResultMessage(effect, isCombo, this.player, this.ai)
|
|
2405
|
+
return this.buildResultMessage(effect, isCombo, this.player, this.ai) + (bonusMessage ? `
|
|
2406
|
+
|
|
2407
|
+
${bonusMessage}` : "");
|
|
2408
|
+
}
|
|
2409
|
+
// 生成玩家回合奖励信息
|
|
2410
|
+
buildMyTurnBonusMessage(effect, isCombo) {
|
|
2411
|
+
let bonusMessage = "";
|
|
2412
|
+
this.singleBonus = 0;
|
|
2413
|
+
this.singleBonusMultiplier = 1;
|
|
2414
|
+
if (isCombo) {
|
|
2415
|
+
this.singleBonus += 10;
|
|
2416
|
+
bonusMessage += `触发组合技,获得10点分数!
|
|
2417
|
+
`;
|
|
2418
|
+
}
|
|
2419
|
+
if ((effect.damage || 0) * (effect.damageTimes || 1) >= 20 && this.ai.shield === 0) {
|
|
2420
|
+
const effectBonus = Math.round((effect.damage || 0) * (effect.damageTimes || 1) * 0.8);
|
|
2421
|
+
this.singleBonus += effectBonus;
|
|
2422
|
+
bonusMessage += `沉重一击!获得${effectBonus}点分数!
|
|
2423
|
+
`;
|
|
2424
|
+
}
|
|
2425
|
+
if ((effect.pierceDamage || 0) >= 15) {
|
|
2426
|
+
const effectBonus = Math.round(effect.pierceDamage * 0.5);
|
|
2427
|
+
this.singleBonus += effectBonus;
|
|
2428
|
+
bonusMessage += `穿刺一击!获得${effectBonus}点分数!
|
|
2429
|
+
`;
|
|
2430
|
+
}
|
|
2431
|
+
if ((effect.destroyShield || 0) >= Math.min(this.ai.shield, 3) && this.ai.shield > 1) {
|
|
2432
|
+
const effectBonus = Math.round(this.ai.shield * 5);
|
|
2433
|
+
this.singleBonus += effectBonus;
|
|
2434
|
+
bonusMessage += `快速破盾!获得${effectBonus}点分数!
|
|
2435
|
+
`;
|
|
2436
|
+
}
|
|
2437
|
+
if ((effect.bleed || 0) + this.ai.bleed > 9) {
|
|
2438
|
+
const effectBonus = Math.round(this.ai.bleed);
|
|
2439
|
+
this.singleBonus += effectBonus;
|
|
2440
|
+
bonusMessage += `流血打击!获得${effectBonus}点分数!
|
|
2441
|
+
`;
|
|
2442
|
+
}
|
|
2443
|
+
if ((effect.shield || 0) + this.player.shield >= 5) {
|
|
2444
|
+
const effectBonus = Math.round(((effect.shield || 0) + this.player.shield) * 2);
|
|
2445
|
+
this.singleBonus += effectBonus;
|
|
2446
|
+
bonusMessage += `强效护盾!获得${effectBonus}点分数!
|
|
2447
|
+
`;
|
|
2448
|
+
}
|
|
2449
|
+
if ((effect.selfbleed || 0) < -2 && this.player.bleed > -effect.selfbleed) {
|
|
2450
|
+
const effectBonus = Math.round(this.player.bleed * 2);
|
|
2451
|
+
this.singleBonus += effectBonus;
|
|
2452
|
+
bonusMessage += `关键治疗!获得${effectBonus}点分数!
|
|
2453
|
+
`;
|
|
2454
|
+
}
|
|
2455
|
+
if ((effect.stun || effect.weakStun && this.ai.shield === 0) && this.ai.status === 0 /* Normal */ && this.ai.bleed > 5) {
|
|
2456
|
+
const effectBonus = Math.round(this.ai.bleed * 2);
|
|
2457
|
+
this.singleBonus += effectBonus;
|
|
2458
|
+
bonusMessage += `流血眩晕!获得${effectBonus}点分数!
|
|
2459
|
+
`;
|
|
2460
|
+
}
|
|
2461
|
+
if ((effect.strengthChange || 0) < -1 && this.ai.strength < 0) {
|
|
2462
|
+
const effectBonus = Math.round(effect.strengthChange * -5);
|
|
2463
|
+
this.singleBonus += effectBonus;
|
|
2464
|
+
bonusMessage += `强效削弱!获得${effectBonus}点分数!
|
|
2465
|
+
`;
|
|
2466
|
+
}
|
|
2467
|
+
if (this.ai.counterAttack > 0 && !effect.damage && !effect.pierceDamage) {
|
|
2468
|
+
const effectBonus = Math.round(this.ai.counterAttack);
|
|
2469
|
+
this.singleBonus += effectBonus;
|
|
2470
|
+
bonusMessage += `反击规避!获得${effectBonus}点分数!
|
|
2471
|
+
`;
|
|
2472
|
+
}
|
|
2473
|
+
if (this.player.hp < 10 && !this.player.shield && (effect.damage || effect.pierceDamage)) {
|
|
2474
|
+
const effectBonus = (10 - this.player.hp) * 2;
|
|
2475
|
+
this.singleBonus += effectBonus;
|
|
2476
|
+
bonusMessage += `濒死反击!获得${effectBonus}点分数!
|
|
2477
|
+
`;
|
|
2478
|
+
}
|
|
2479
|
+
if (effect.revwersalOfStrength && this.player.strength <= this.ai.strength - 5) {
|
|
2480
|
+
const effectBonus = Math.round((this.ai.strength - this.player.strength) * 3);
|
|
2481
|
+
this.singleBonus += effectBonus;
|
|
2482
|
+
bonusMessage += `逆转大局!获得${effectBonus}点分数!
|
|
2483
|
+
`;
|
|
2484
|
+
}
|
|
2485
|
+
if ((effect.damage || 0) + (effect.pierceDamage || 0) >= 10 && this.ai.vulnerablility > 0) {
|
|
2486
|
+
const effectBonus = this.ai.vulnerablility * 0.1;
|
|
2487
|
+
this.singleBonusMultiplier += effectBonus;
|
|
2488
|
+
bonusMessage += `易伤打击!本回合分数增加${100 * effectBonus}%!
|
|
2489
|
+
`;
|
|
2490
|
+
}
|
|
2491
|
+
if (this.turnCount === 4 + Math.round(this.level / 3) && this.player.hp > this.ai.hp * 1.2 && this.player.shield > this.ai.shield && this.player.strength > this.ai.strength && this.player.bleed < this.ai.bleed) {
|
|
2492
|
+
const effectBonus = Math.round(this.player.hp * 0.1 + this.player.shield + this.player.strength * 0.5);
|
|
2493
|
+
this.singleBonus += effectBonus;
|
|
2494
|
+
this.singleBonusMultiplier *= 2;
|
|
2495
|
+
bonusMessage += `压倒性的优势!获得${effectBonus}点分数!本回合分数*2!
|
|
2496
|
+
`;
|
|
2497
|
+
}
|
|
2498
|
+
if (effect.magnificentEnd && this.ai.bleed > 4) {
|
|
2499
|
+
const effectBonus = Math.round(this.ai.bleed * 1.5);
|
|
2500
|
+
this.singleBonusMultiplier *= effectBonus;
|
|
2501
|
+
this.bonus *= 2;
|
|
2502
|
+
bonusMessage += `华丽收场!当前总分数*2,本回合分数*${effectBonus}!
|
|
2503
|
+
`;
|
|
2504
|
+
}
|
|
2505
|
+
if (this.comboCombos >= 1) {
|
|
2506
|
+
this.singleBonusMultiplier += this.comboCombos / 5;
|
|
2507
|
+
bonusMessage += `组合技连击${this.comboCombos}次!本回合分数+${20 * this.comboCombos}%!`;
|
|
2508
|
+
}
|
|
2509
|
+
return bonusMessage;
|
|
2374
2510
|
}
|
|
2375
2511
|
processAiTurn(handA, handB) {
|
|
2376
|
-
if (this.ai.hp <= 0)
|
|
2377
|
-
return
|
|
2378
|
-
|
|
2512
|
+
if (this.ai.hp <= 0)
|
|
2513
|
+
return `已经结束游戏
|
|
2514
|
+
|
|
2515
|
+
` + this.buildAiTurnBonusMessage(SKILL_MAP["-1"]);
|
|
2379
2516
|
if (this.ai.status === 2 /* lastStunned */) {
|
|
2380
2517
|
this.ai.status = 0 /* Normal */;
|
|
2381
2518
|
}
|
|
2382
2519
|
if (this.ai.status === 1 /* Stunned */) {
|
|
2383
2520
|
this.ai.status = 2 /* lastStunned */;
|
|
2384
2521
|
this.ai = this.applyEffectToSelf(this.player, this.ai, SKILL_MAP["-1"]);
|
|
2385
|
-
return "
|
|
2522
|
+
return "被眩晕,跳过回合,本回合分数奖励继承到下一回合";
|
|
2386
2523
|
}
|
|
2387
2524
|
const sum = (handA + handB) % 10;
|
|
2388
2525
|
this.ai[handA === this.ai.left ? "left" : "right"] = sum;
|
|
@@ -2393,9 +2530,54 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2393
2530
|
isCombo = true;
|
|
2394
2531
|
effect = { ...combo };
|
|
2395
2532
|
}
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2533
|
+
const playerState = this.player;
|
|
2534
|
+
const aiState = this.ai;
|
|
2535
|
+
const bonusMessage = this.buildAiTurnBonusMessage(effect);
|
|
2536
|
+
this.player = this.applyEffectToEnemy(aiState, playerState, effect, !!combo);
|
|
2537
|
+
this.ai = this.applyEffectToSelf(playerState, aiState, effect);
|
|
2538
|
+
return handA + "碰" + handB + "," + this.buildResultMessage(effect, isCombo, this.ai, this.player) + (bonusMessage ? `
|
|
2539
|
+
|
|
2540
|
+
${bonusMessage}` : "");
|
|
2541
|
+
}
|
|
2542
|
+
buildAiTurnBonusMessage(effect) {
|
|
2543
|
+
let bonusMessage = "";
|
|
2544
|
+
if ((effect.damage || effect.pierceDamage) && this.player.counterAttack > 0) {
|
|
2545
|
+
const effectBonus = Math.max(this.player.counterAttack + this.player.strength, 0);
|
|
2546
|
+
this.singleBonus += effectBonus;
|
|
2547
|
+
bonusMessage += `反击!获得${effectBonus}点分数!
|
|
2548
|
+
`;
|
|
2549
|
+
}
|
|
2550
|
+
if ((effect.damage || 0) > 12 && this.player.shield > 0) {
|
|
2551
|
+
const effectBonus = Math.round(effect.damage);
|
|
2552
|
+
this.singleBonus += effectBonus;
|
|
2553
|
+
bonusMessage += `关键格挡!获得${effectBonus}点分数!
|
|
2554
|
+
`;
|
|
2555
|
+
}
|
|
2556
|
+
if (this.player.shield > 0 && effect.damage && this.player.counterAttack > 0) {
|
|
2557
|
+
const effectBonus = Math.round(this.player.shield * 2 + this.player.counterAttack);
|
|
2558
|
+
this.singleBonus += effectBonus;
|
|
2559
|
+
bonusMessage += `盾反!获得${effectBonus}点分数!
|
|
2560
|
+
`;
|
|
2561
|
+
}
|
|
2562
|
+
if (effect.damage && this.player.vulnerablility > 0 && this.player.shield > 0) {
|
|
2563
|
+
const effectBonus = 0.5;
|
|
2564
|
+
this.singleBonusMultiplier += effectBonus;
|
|
2565
|
+
bonusMessage += `易伤保护!本回合分数增加${100 * effectBonus}%!
|
|
2566
|
+
`;
|
|
2567
|
+
}
|
|
2568
|
+
if (effect.weakStun && this.player.shield > 0) {
|
|
2569
|
+
const effectBonus = 0.3;
|
|
2570
|
+
this.singleBonusMultiplier += effectBonus;
|
|
2571
|
+
bonusMessage += `眩晕格挡!本回合分数增加${100 * effectBonus}%!
|
|
2572
|
+
`;
|
|
2573
|
+
}
|
|
2574
|
+
const turnBonus = Math.round(this.singleBonus * this.singleBonusMultiplier);
|
|
2575
|
+
this.bonus += turnBonus;
|
|
2576
|
+
bonusMessage += `本回合总计获得${this.singleBonus}*${this.singleBonusMultiplier}=${turnBonus}点分数
|
|
2577
|
+
当前总分数:${this.bonus}`;
|
|
2578
|
+
this.singleBonus = 0;
|
|
2579
|
+
this.singleBonusMultiplier = 1;
|
|
2580
|
+
return bonusMessage;
|
|
2399
2581
|
}
|
|
2400
2582
|
// damage?: number // 普通伤害
|
|
2401
2583
|
// damageTimes?: number // 伤害次数
|
|
@@ -2433,6 +2615,8 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2433
2615
|
}
|
|
2434
2616
|
}
|
|
2435
2617
|
}
|
|
2618
|
+
if (effect.revwersalOfStrength)
|
|
2619
|
+
target.strength = self.strength;
|
|
2436
2620
|
if (effect.magnificentEnd) {
|
|
2437
2621
|
target.hp -= target.bleed * (target.bleed + 1) / 2;
|
|
2438
2622
|
target.bleed = 0;
|
|
@@ -2463,6 +2647,8 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2463
2647
|
self.counterAttack = effect.counterAttack;
|
|
2464
2648
|
if (enemy.counterAttack > 0 && (effect.damage > 0 || effect.pierceDamage > 0))
|
|
2465
2649
|
self.hp -= Math.max(enemy.counterAttack + (enemy.strength || 0), 0);
|
|
2650
|
+
if (effect.revwersalOfStrength)
|
|
2651
|
+
self.strength = enemy.strength;
|
|
2466
2652
|
if (effect.selfStun && self.status !== 2 /* lastStunned */)
|
|
2467
2653
|
self.status = 1 /* Stunned */;
|
|
2468
2654
|
if (effect.selfbleed)
|
|
@@ -2629,8 +2815,10 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2629
2815
|
attacker[handA === attacker.left ? "left" : "right"] = sum;
|
|
2630
2816
|
const combo = this.checkCombo(attacker.left, attacker.right);
|
|
2631
2817
|
const effect = combo ? combo : SKILL_MAP[sum.toString()] || {};
|
|
2632
|
-
|
|
2633
|
-
|
|
2818
|
+
const defenderState = defender;
|
|
2819
|
+
const attackerState = attacker;
|
|
2820
|
+
defender = this.applyEffectToEnemy(attackerState, defenderState, effect, !!combo);
|
|
2821
|
+
attacker = this.applyEffectToSelf(defenderState, attackerState, effect);
|
|
2634
2822
|
}
|
|
2635
2823
|
if (attackerIndex === 1) {
|
|
2636
2824
|
const temp = attacker;
|
|
@@ -2644,13 +2832,43 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2644
2832
|
evaluateState(state) {
|
|
2645
2833
|
const ai = state[1];
|
|
2646
2834
|
const player = state[0];
|
|
2835
|
+
const aiBaseHP = this.baseHP + this.level * this.aiLevelHp;
|
|
2836
|
+
const playerBaseHP = this.baseHP + this.level * this.playerLevelHP;
|
|
2647
2837
|
let score = ai.hp - player.hp;
|
|
2648
|
-
|
|
2649
|
-
|
|
2838
|
+
if (ai.hp < aiBaseHP / 2)
|
|
2839
|
+
score -= Math.round(aiBaseHP / 4);
|
|
2840
|
+
if (player.hp < playerBaseHP / 2)
|
|
2841
|
+
score += Math.round(playerBaseHP / 4);
|
|
2842
|
+
if (ai.hp < aiBaseHP / 4)
|
|
2843
|
+
score -= Math.round(aiBaseHP / 4);
|
|
2844
|
+
if (player.hp < playerBaseHP / 4)
|
|
2845
|
+
score += Math.round(playerBaseHP / 4);
|
|
2846
|
+
if (ai.hp < aiBaseHP / 8)
|
|
2847
|
+
score -= Math.round(aiBaseHP / 4);
|
|
2848
|
+
if (player.hp < playerBaseHP / 8)
|
|
2849
|
+
score += Math.round(playerBaseHP / 4);
|
|
2850
|
+
score += Math.min(ai.strength * 5, 100);
|
|
2851
|
+
score -= Math.min(player.strength * 5);
|
|
2852
|
+
if (ai.strength < 0)
|
|
2853
|
+
score += Math.round(ai.strength * 5);
|
|
2854
|
+
if (player.strength < 0)
|
|
2855
|
+
score -= Math.round(player.strength * 5);
|
|
2650
2856
|
score += ai.shield * 8;
|
|
2651
2857
|
score -= player.shield * 8;
|
|
2652
|
-
score -= Math.min(Math.round(ai.bleed * ai.bleed / 2.5)
|
|
2653
|
-
score += Math.min(Math.round(player.bleed * player.bleed / 2.5)
|
|
2858
|
+
score -= Math.min(Math.round(ai.bleed * ai.bleed / 2.5));
|
|
2859
|
+
score += Math.min(Math.round(player.bleed * player.bleed / 2.5));
|
|
2860
|
+
if (ai.status === 1 /* Stunned */)
|
|
2861
|
+
score -= 10;
|
|
2862
|
+
if (player.status === 1 /* Stunned */)
|
|
2863
|
+
score += 10;
|
|
2864
|
+
if (ai.counterAttack > 0)
|
|
2865
|
+
score += Math.max(ai.counterAttack + (ai.strength || 0), 0);
|
|
2866
|
+
if (player.counterAttack > 0)
|
|
2867
|
+
score -= Math.max(player.counterAttack + (player.strength || 0), 0);
|
|
2868
|
+
if (ai.vulnerablility > 0)
|
|
2869
|
+
score -= Math.round(ai.vulnerablility * 4);
|
|
2870
|
+
if (player.vulnerablility > 0)
|
|
2871
|
+
score += Math.round(player.vulnerablility * 4);
|
|
2654
2872
|
if (player.hp <= 0)
|
|
2655
2873
|
score += 1e5;
|
|
2656
2874
|
if (ai.hp <= 0)
|
|
@@ -2658,26 +2876,26 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2658
2876
|
return score;
|
|
2659
2877
|
}
|
|
2660
2878
|
generateChat(Score) {
|
|
2661
|
-
if (this.lastScore <
|
|
2879
|
+
if (this.lastScore < 9e4 && Score > 9e4) {
|
|
2662
2880
|
return "我觉得你要输了哦~";
|
|
2663
2881
|
}
|
|
2664
2882
|
if (this.lastScore < 0 && Score > 0) {
|
|
2665
2883
|
return "局势发生变化了呢~";
|
|
2666
2884
|
}
|
|
2667
|
-
if (this.lastScore >
|
|
2668
|
-
return "
|
|
2669
|
-
}
|
|
2885
|
+
if (Score - this.lastScore > 10)
|
|
2886
|
+
return "看招!";
|
|
2670
2887
|
}
|
|
2671
2888
|
instuction = `游戏说明:
|
|
2672
2889
|
这个游戏的基本玩法是:
|
|
2673
2890
|
两个人玩,两只手分别可以做出"一到十"的手势,每一种手势代表一个招式。
|
|
2674
2891
|
例如"三"是${SKILL_MAP["3"].name},"四"是${SKILL_MAP["4"].name}等;当两只手符合特定组合时还可以触发组合技;
|
|
2675
2892
|
每个人在自己的回合可以选择用自己的一只手碰对方的另一只手,两者数值相加,如果超过十仅保留个位。
|
|
2676
|
-
例如自己的"一"碰对方的"二"变成"三"
|
|
2893
|
+
例如自己的"一"碰对方的"二"变成"三"同时触发技能"${SKILL_MAP["3"].name}"对对方造成伤害。
|
|
2677
2894
|
每次开局两人初始手势随机,由玩家先手,双方轮流行动。
|
|
2895
|
+
当自身两手手势相同时,无论选择左手还是右手最终发生变化的都是左手。
|
|
2678
2896
|
玩家初始有"${this.baseHP} + ${this.playerLevelHP} * 难度"血量。
|
|
2679
2897
|
ai初始有"${this.baseHP} + ${this.aiLevelHp} * 难度"血量。
|
|
2680
|
-
玩家初始有"难度 /
|
|
2898
|
+
玩家初始有"难度 / 2"护盾,四舍五入取整。
|
|
2681
2899
|
血量没有上限,率先将对方血量减到零的人获胜:
|
|
2682
2900
|
具体的技能设计如下:{
|
|
2683
2901
|
一:${SKILL_MAP["1"].name}:造成${SKILL_MAP["1"].pierceDamage}穿刺伤害,${SKILL_MAP["1"].bleed}流血;
|
|
@@ -2707,6 +2925,7 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2707
2925
|
七+八:${SKILL_MAP["7+8"].name}:造成${SKILL_MAP["7+8"].pierceDamage}穿刺伤害,破坏对方${SKILL_MAP["7+8"].destroyShield}层护盾,眩晕自己
|
|
2708
2926
|
六+二:${SKILL_MAP["2+6"].name}:造成${SKILL_MAP["2+6"].damage}伤害,恢复${SKILL_MAP["2+6"].heal}生命,自身${SKILL_MAP["2+6"].selfbleed}流血,自身增加${SKILL_MAP["2+6"].selfstrengthChange}力量,眩晕对方
|
|
2709
2927
|
三+七:${SKILL_MAP["3+7"].name}:获得${SKILL_MAP["3+7"].counterAttack}层反击,破坏对方${SKILL_MAP["3+7"].destroyShield}层护盾,对方左手数值增加${SKILL_MAP["3+7"].addLeft},右手数值增加${SKILL_MAP["3+7"].addRight}
|
|
2928
|
+
九+十:${SKILL_MAP["0+9"].name}:逆转双方力量。
|
|
2710
2929
|
十+十:${SKILL_MAP["0+0"].name}:对对方造成${SKILL_MAP["0+0"].bleed}流血,自身${SKILL_MAP["0+0"].selfstrengthChange}力量,然后立即结算对方全部流血
|
|
2711
2930
|
}
|
|
2712
2931
|
注:
|
|
@@ -2714,11 +2933,12 @@ var OneTouchSingleGame = class extends abstractGameSingleGame {
|
|
|
2714
2933
|
护盾效果:每一层护盾可阻挡下一次受到的普通伤害,如果伤害来源是组合技则消耗两层护盾(若仅有一层则消耗一层)。护盾上限为五层。
|
|
2715
2934
|
眩晕效果:跳过自己的下一个回合,若上回合已经被眩晕,则本回合不受眩晕影响(即不可被连续眩晕)
|
|
2716
2935
|
弱眩晕效果:若对方没有护盾,则眩晕对方一回合
|
|
2717
|
-
|
|
2936
|
+
反击:下一回合若对方行动中有攻击,则对方攻击前受到反击层数点穿刺伤害,此效果受力量加成,且仅持续一回合
|
|
2718
2937
|
穿刺伤害:不被护盾影响的伤害(不会消耗护盾)
|
|
2719
2938
|
力量效果:每有一点力量,每次造成的伤害+1,若为负数则减一
|
|
2720
2939
|
易伤效果:受到的普通伤害+50%,自己的回合结束时减少一层
|
|
2721
2940
|
组合技:两只手势符合组合技条件时触发组合技,组合技的效果会覆盖普通技能的效果,组合无序
|
|
2941
|
+
bonus: 当行动导致关键效果时,获得额外奖励,在ai回合结束时结算,若ai被眩晕则奖励继承到下一回合
|
|
2722
2942
|
`;
|
|
2723
2943
|
};
|
|
2724
2944
|
var OneTouchGame = class extends abstractGame {
|
|
@@ -2734,9 +2954,9 @@ var OneTouchGame = class extends abstractGame {
|
|
|
2734
2954
|
level = parseInt(args[0]);
|
|
2735
2955
|
else {
|
|
2736
2956
|
setTimeout(() => {
|
|
2737
|
-
session.send("未输入难度等级(2-10),默认设为
|
|
2957
|
+
session.send("未输入难度等级(2-10),默认设为3");
|
|
2738
2958
|
}, 500);
|
|
2739
|
-
level =
|
|
2959
|
+
level = 3;
|
|
2740
2960
|
}
|
|
2741
2961
|
if (level < 2 || level > 10) {
|
|
2742
2962
|
level = level < 2 ? 2 : 10;
|
|
@@ -2895,20 +3115,17 @@ var Game = class {
|
|
|
2895
3115
|
return;
|
|
2896
3116
|
case "一碰一":
|
|
2897
3117
|
const oneTouchResult = result;
|
|
2898
|
-
const
|
|
2899
|
-
const oneTouchBonus = Math.floor(oneTouchLevel * (Math.random() * 2 + 9));
|
|
3118
|
+
const oneTouchBonus = oneTouchResult.bonus;
|
|
2900
3119
|
if (oneTouchResult.win === 1 /* win */) {
|
|
2901
|
-
updateUserP(ctx, user, oneTouchBonus
|
|
2902
|
-
updateFavorability(ctx, user,
|
|
2903
|
-
session.send("真厉害,奖励你" + oneTouchBonus
|
|
3120
|
+
updateUserP(ctx, user, oneTouchBonus);
|
|
3121
|
+
updateFavorability(ctx, user, Math.round(oneTouchBonus * 0.02));
|
|
3122
|
+
session.send("真厉害,奖励你" + oneTouchBonus + "p点,好感度+" + Math.round(oneTouchBonus * 0.02));
|
|
2904
3123
|
} else if (oneTouchResult.win === 2 /* lose */) {
|
|
2905
|
-
updateUserP(ctx, user,
|
|
2906
|
-
session.send("真可惜,你输了" + oneTouchBonus + "p点");
|
|
2907
|
-
} else
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
updateUserP(ctx, user, -oneTouchBonus);
|
|
2911
|
-
session.send("游戏中断,你输了" + oneTouchBonus + "p点");
|
|
3124
|
+
updateUserP(ctx, user, oneTouchBonus);
|
|
3125
|
+
session.send("真可惜,你输了" + -oneTouchBonus + "p点");
|
|
3126
|
+
} else {
|
|
3127
|
+
updateUserP(ctx, user, oneTouchBonus);
|
|
3128
|
+
session.send("游戏中断,你输了" + -oneTouchBonus + "p点");
|
|
2912
3129
|
}
|
|
2913
3130
|
return;
|
|
2914
3131
|
default:
|
|
@@ -3231,7 +3448,7 @@ var SAT = class extends Sat {
|
|
|
3231
3448
|
else
|
|
3232
3449
|
logger12.info(`Satori AI:${response.content}`);
|
|
3233
3450
|
}
|
|
3234
|
-
if (this.config.reasoner_filter)
|
|
3451
|
+
if (this.config.reasoner_filter && !response.error)
|
|
3235
3452
|
response = filterResponse(response.content, this.config.reasoner_filter_word.split("-"));
|
|
3236
3453
|
return response;
|
|
3237
3454
|
}
|