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.
@@ -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
- message: string;
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: "模型发生复读行为,建议重置对话", error: true };
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": { damage: 0, name: "无效" },
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 { message: `${this.level}`, win: this.winningFlag, gameName: "一碰一", playerID: this.session.userId };
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 / 3),
2261
- strength: Math.round(level / 5),
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 / 10 + this.level * this.aiLevelHp / this.playerLevelHP))} ${this.ai.hp}HP`,
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 / 10 + this.level))} ${this.player.hp}HP`,
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(`你的行动:${result}
2352
+ return wrapInHTML2(`▶️你的行动:${result}
2323
2353
 
2324
- 我的行动:${aiResult}
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 === playerState.left ? "left" : "right"] = sum;
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
- this.player = this.applyEffectToEnemy(this.ai, this.player, effect, !!combo);
2397
- this.ai = this.applyEffectToSelf(this.player, this.ai, effect);
2398
- return handA + "碰" + handB + "," + this.buildResultMessage(effect, isCombo, this.ai, this.player);
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
- defender = this.applyEffectToEnemy(attacker, defender, effect, !!combo);
2633
- attacker = this.applyEffectToSelf(defender, attacker, effect);
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
- score += Math.min(ai.strength * 5, 50);
2649
- score -= Math.min(player.strength * 5, 50);
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), 900);
2653
- score += Math.min(Math.round(player.bleed * player.bleed / 2.5), 900);
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 < 1e5 && Score > 1e5) {
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 > -1e5 && Score < -1e5) {
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
- 例如自己的"一"碰对方的"二"变成"三"可以触发技能"${SKILL_MAP["3"].name}"对对方造成伤害。
2893
+ 例如自己的"一"碰对方的"二"变成"三"同时触发技能"${SKILL_MAP["3"].name}"对对方造成伤害。
2677
2894
  每次开局两人初始手势随机,由玩家先手,双方轮流行动。
2895
+ 当自身两手手势相同时,无论选择左手还是右手最终发生变化的都是左手。
2678
2896
  玩家初始有"${this.baseHP} + ${this.playerLevelHP} * 难度"血量。
2679
2897
  ai初始有"${this.baseHP} + ${this.aiLevelHp} * 难度"血量。
2680
- 玩家初始有"难度 / 3"护盾,"难度 / 5"力量,四舍五入取整。
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),默认设为5");
2957
+ session.send("未输入难度等级(2-10),默认设为3");
2738
2958
  }, 500);
2739
- level = 5;
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 oneTouchLevel = parseInt(oneTouchResult.message);
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 * 2);
2902
- updateFavorability(ctx, user, oneTouchLevel * 2);
2903
- session.send("真厉害,奖励你" + oneTouchBonus * 2 + "p点,好感度+" + Math.round(oneTouchLevel * 0.2));
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, -oneTouchBonus);
2906
- session.send("真可惜,你输了" + oneTouchBonus + "p点");
2907
- } else if (oneTouchResult.win === 3 /* draw */)
2908
- session.send("平局,稍后再战吧");
2909
- else {
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
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-satori-ai",
3
3
  "description": "基于 Satori 适配器的智能对话插件,具备用户画像、长期记忆、常识管理和好感度系统",
4
- "version": "1.3.3",
4
+ "version": "1.3.4",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "types": "lib/index.d.ts",