koishi-plugin-game-mini 0.3.2 → 0.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/index.d.ts CHANGED
@@ -146,8 +146,6 @@ export interface Config {
146
146
  wrong: string;
147
147
  roundEnd: string;
148
148
  gameEnd: string;
149
- rankTitle: string;
150
- rankEmpty: string;
151
149
  disabled: string;
152
150
  autoStop: string;
153
151
  };
package/lib/index.js CHANGED
@@ -77,8 +77,6 @@ const defaultMessages = {
77
77
  wrong: "接龙失败!",
78
78
  roundEnd: "第 {0} 回合结束!剩余回合:{1}",
79
79
  gameEnd: "🎉 成语接龙比赛结束!🎉",
80
- rankTitle: "🏆 本局排行榜 🏆",
81
- rankEmpty: "暂无参与记录~",
82
80
  disabled: "成语接龙功能已关闭,请联系管理员开启",
83
81
  autoStop: "太久没人玩啦,比赛自动结束~"
84
82
  },
@@ -235,7 +233,7 @@ exports.Config = koishi_1.Schema.intersect([
235
233
  koishi_1.Schema.object({
236
234
  chengyuJielong: koishi_1.Schema.object({
237
235
  totalRounds: koishi_1.Schema.number().min(1).default(10).description('总回合数'),
238
- showRank: koishi_1.Schema.boolean().default(true).description('游戏结束后显示本局排行榜'),
236
+ showRank: koishi_1.Schema.boolean().default(false).description('游戏结束后显示本局排行榜'),
239
237
  autoPlayDelay: koishi_1.Schema.number().min(0).default(10).description('机器人自动操作延迟(秒)'),
240
238
  autoPlayMaxCount: koishi_1.Schema.number().min(1).default(5).description('机器人最大自动操作次数'),
241
239
  autoStopInactiveTime: koishi_1.Schema.number().min(0).default(60).description('游戏无操作自动停止时间(秒)'),
@@ -255,8 +253,6 @@ exports.Config = koishi_1.Schema.intersect([
255
253
  wrong: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.wrong).description('接龙失败提示'),
256
254
  roundEnd: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.roundEnd).description('回合结束提示\n{0}-当前回合, {1}-剩余回合'),
257
255
  gameEnd: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.gameEnd).description('游戏结束提示'),
258
- rankTitle: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.rankTitle).description('本局排行榜标题'),
259
- rankEmpty: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.rankEmpty).description('本局排行榜为空提示'),
260
256
  disabled: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.disabled).description('功能禁用提示'),
261
257
  autoStop: koishi_1.Schema.string().default(defaultMessages.chengyuJielong.autoStop).description('自动停止提示'),
262
258
  }).description('💬 成语接龙消息配置'),
@@ -528,7 +524,8 @@ async function apply(ctx, cfg) {
528
524
  target: 0,
529
525
  currentMin: cfg.guessNumber.min,
530
526
  currentMax: cfg.guessNumber.max,
531
- botGuess: []
527
+ botGuess: [],
528
+ autoPlayCount: 0
532
529
  },
533
530
  wzHero: {
534
531
  started: false,
@@ -697,6 +694,63 @@ async function apply(ctx, cfg) {
697
694
  const refreshActive = (st) => {
698
695
  st.chengyuJielong.lastActiveTime = Date.now();
699
696
  };
697
+ const doGuessNumberAutoPlay = async (session, key, st) => {
698
+ if (!st.guessNumber.started)
699
+ return;
700
+ if (st.guessNumber.autoPlayCount >= cfg.guessNumber.autoPlayMaxCount)
701
+ return;
702
+ st.guessNumber.autoPlayCount += 1;
703
+ const guess = koishi_1.Random.int(st.guessNumber.currentMin, st.guessNumber.currentMax + 1);
704
+ await session.send(`机器人猜:${guess}`);
705
+ if (guess === st.guessNumber.target) {
706
+ st.guessNumber.players['bot'] = st.guessNumber.players['bot'] || {
707
+ platform: 'bot',
708
+ userId: 'bot',
709
+ name: '机器人',
710
+ score: 0,
711
+ correctCount: 0,
712
+ playCount: 0,
713
+ lastGameTime: 0
714
+ };
715
+ st.guessNumber.players['bot'].score += cfg.guessNumber.penaltyScore;
716
+ let message = d.guessNumber.correct;
717
+ if (cfg.guessNumber.enablePenalty) {
718
+ Object.keys(st.guessNumber.players).forEach(key => {
719
+ if (key !== 'bot') {
720
+ st.guessNumber.players[key].score += cfg.guessNumber.rewardScore;
721
+ }
722
+ });
723
+ message += `\n猜中者被扣 ${-cfg.guessNumber.penaltyScore} 分,其他玩家各加 ${cfg.guessNumber.rewardScore} 分`;
724
+ }
725
+ await session.send(message);
726
+ st.guessNumber.currentRound += 1;
727
+ if (st.guessNumber.currentRound > st.guessNumber.totalRounds) {
728
+ st.guessNumber.started = false;
729
+ clearAllTimers(st);
730
+ await session.send(d.guessNumber.gameEnd);
731
+ if (cfg.guessNumber.showRank && !isPrivate(session)) {
732
+ const rankText = generateGameRankText(st.guessNumber.players, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
733
+ await session.send(rankText);
734
+ }
735
+ clearGameData(st.guessNumber);
736
+ }
737
+ else {
738
+ st.guessNumber.target = koishi_1.Random.int(st.guessNumber.currentMin, st.guessNumber.currentMax);
739
+ await session.send(d.guessNumber.roundEnd.replace('{0}', st.guessNumber.currentRound.toString()).replace('{1}', (st.guessNumber.totalRounds - st.guessNumber.currentRound).toString()));
740
+ await session.send(`新回合开始!猜数字范围:${st.guessNumber.currentMin} - ${st.guessNumber.currentMax}`);
741
+ }
742
+ }
743
+ else if (guess < st.guessNumber.target) {
744
+ st.guessNumber.currentMin = guess + 1;
745
+ await session.send(d.guessNumber.tooSmall.replace('{0}', st.guessNumber.currentMin.toString()).replace('{1}', st.guessNumber.currentMax.toString()));
746
+ }
747
+ else {
748
+ st.guessNumber.currentMax = guess - 1;
749
+ await session.send(d.guessNumber.tooBig.replace('{0}', st.guessNumber.currentMin.toString()).replace('{1}', st.guessNumber.currentMax.toString()));
750
+ }
751
+ gameStates.set(key, st);
752
+ setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
753
+ };
700
754
  const doAutoPlay = async (session, key, st) => {
701
755
  if (!st.chengyuJielong.started)
702
756
  return;
@@ -745,7 +799,7 @@ async function apply(ctx, cfg) {
745
799
  await session.send(d.chengyuJielong.apiError);
746
800
  }
747
801
  gameStates.set(key, st);
748
- setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, d.chengyuJielong.rankTitle, d.chengyuJielong.rankEmpty);
802
+ setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
749
803
  };
750
804
  ctx.middleware(async (session, next) => {
751
805
  if (!session.content)
@@ -780,12 +834,12 @@ async function apply(ctx, cfg) {
780
834
  }
781
835
  if (st.chengyuJielong.botTurn) {
782
836
  await session.send('现在是机器人的回合,请稍候...');
783
- setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, d.chengyuJielong.rankTitle, d.chengyuJielong.rankEmpty);
837
+ setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
784
838
  return;
785
839
  }
786
840
  if (!isFourCharIdiom(content)) {
787
841
  await session.send(d.chengyuJielong.notIdiom);
788
- setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, d.chengyuJielong.rankTitle, d.chengyuJielong.rankEmpty);
842
+ setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
789
843
  return;
790
844
  }
791
845
  try {
@@ -848,7 +902,7 @@ async function apply(ctx, cfg) {
848
902
  logError(`[成语接龙玩家] API调用失败: ${err.message}`, err);
849
903
  await session.send(d.chengyuJielong.apiError);
850
904
  }
851
- setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, d.chengyuJielong.rankTitle, d.chengyuJielong.rankEmpty);
905
+ setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
852
906
  gameStates.set(key, st);
853
907
  return;
854
908
  }
@@ -911,7 +965,8 @@ async function apply(ctx, cfg) {
911
965
  const dt = r.data;
912
966
  if (dt.success) {
913
967
  let reply = '';
914
- if (dt.message.includes('正确') || dt.message.includes('答对')) {
968
+ const isCorrect = dt.data?.result === 'correct';
969
+ if (isCorrect) {
915
970
  st.chengyuImage.players[playerKey].score += cfg.chengyuImage.rewardScore;
916
971
  st.chengyuImage.players[playerKey].correctCount += 1;
917
972
  await savePlayerData(session, st.chengyuImage.players[playerKey]);
@@ -1087,11 +1142,21 @@ async function apply(ctx, cfg) {
1087
1142
  const num = parseInt(content);
1088
1143
  if (isNaN(num)) {
1089
1144
  setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
1145
+ if (cfg.guessNumber.botParticipateInGroup && !isPrivate(session) && st.guessNumber.autoPlayCount < cfg.guessNumber.autoPlayMaxCount) {
1146
+ setTimeout(() => {
1147
+ doGuessNumberAutoPlay(session, key, st);
1148
+ }, cfg.guessNumber.autoPlayDelay * 1000);
1149
+ }
1090
1150
  return next();
1091
1151
  }
1092
1152
  if (num < st.guessNumber.currentMin || num > st.guessNumber.currentMax) {
1093
1153
  await session.send(d.guessNumber.outOfRange.replace('{0}', st.guessNumber.currentMin.toString()).replace('{1}', st.guessNumber.currentMax.toString()));
1094
1154
  setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
1155
+ if (cfg.guessNumber.botParticipateInGroup && !isPrivate(session) && st.guessNumber.autoPlayCount < cfg.guessNumber.autoPlayMaxCount) {
1156
+ setTimeout(() => {
1157
+ doGuessNumberAutoPlay(session, key, st);
1158
+ }, cfg.guessNumber.autoPlayDelay * 1000);
1159
+ }
1095
1160
  return;
1096
1161
  }
1097
1162
  if (num === st.guessNumber.target) {
@@ -1134,6 +1199,11 @@ async function apply(ctx, cfg) {
1134
1199
  await session.send(d.guessNumber.tooBig.replace('{0}', st.guessNumber.currentMin.toString()).replace('{1}', st.guessNumber.currentMax.toString()));
1135
1200
  }
1136
1201
  setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
1202
+ if (cfg.guessNumber.botParticipateInGroup && !isPrivate(session) && st.guessNumber.autoPlayCount < cfg.guessNumber.autoPlayMaxCount) {
1203
+ setTimeout(() => {
1204
+ doGuessNumberAutoPlay(session, key, st);
1205
+ }, cfg.guessNumber.autoPlayDelay * 1000);
1206
+ }
1137
1207
  gameStates.set(key, st);
1138
1208
  return;
1139
1209
  }
@@ -1228,10 +1298,16 @@ async function apply(ctx, cfg) {
1228
1298
  st.guessNumber.currentMin = cfg.guessNumber.min;
1229
1299
  st.guessNumber.currentMax = cfg.guessNumber.max;
1230
1300
  st.guessNumber.currentRound = 1;
1301
+ st.guessNumber.autoPlayCount = 0;
1231
1302
  await session.send(d.guessNumber.start.replace('{0}', st.guessNumber.totalRounds.toString()));
1232
1303
  await session.send(`猜数字范围:${st.guessNumber.currentMin} - ${st.guessNumber.currentMax}`);
1233
1304
  gameStates.set(key, st);
1234
1305
  setupAutoStop(session, st.guessNumber, 'guessNumber', d.guessNumber.autoStop, cfg.guessNumber.showRank, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
1306
+ if (cfg.guessNumber.botParticipateInGroup && !isPrivate(session)) {
1307
+ setTimeout(() => {
1308
+ doGuessNumberAutoPlay(session, key, st);
1309
+ }, cfg.guessNumber.autoPlayDelay * 1000);
1310
+ }
1235
1311
  }
1236
1312
  else if (action === '结束') {
1237
1313
  clearGameData(st.guessNumber, cfg.guessNumber.showRank && !isPrivate(session), session, d.guessNumber.rankTitle, d.guessNumber.rankEmpty);
@@ -1379,10 +1455,10 @@ async function apply(ctx, cfg) {
1379
1455
  doAutoPlay(session, key, st);
1380
1456
  }, 100);
1381
1457
  gameStates.set(key, st);
1382
- setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, d.chengyuJielong.rankTitle, d.chengyuJielong.rankEmpty);
1458
+ setupAutoStop(session, st.chengyuJielong, 'chengyuJielong', d.chengyuJielong.autoStop, cfg.chengyuJielong.showRank, undefined, undefined);
1383
1459
  }
1384
1460
  else if (action === '结束') {
1385
- clearGameData(st.chengyuJielong, cfg.chengyuJielong.showRank && !isPrivate(session), session, d.chengyuJielong.rankTitle, d.chengyuJielong.rankEmpty);
1461
+ clearGameData(st.chengyuJielong, cfg.chengyuJielong.showRank && !isPrivate(session), session, undefined, undefined);
1386
1462
  await session.send(d.chengyuJielong.stop);
1387
1463
  gameStates.set(key, st);
1388
1464
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "koishi-plugin-game-mini",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Koishi多功能小游戏合集:猜数字、猜王者英雄、看图猜成语、成语接龙、算24点",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
package/readme.md CHANGED
@@ -114,7 +114,7 @@ This is a lightweight, multi-functional mini-game plugin developed for the Koish
114
114
  | `chengyuImage.rewardScore` | 答对奖励分数 | 1 |
115
115
  | **🐉 成语接龙配置** | | |
116
116
  | `chengyuJielong.totalRounds` | 总回合数 | 10 |
117
- | `chengyuJielong.showRank` | 游戏结束后显示本局排行榜 | true |
117
+ | `chengyuJielong.showRank` | 游戏结束后显示本局排行榜 | false |
118
118
  | `chengyuJielong.autoPlayDelay` | 机器人自动操作延迟(秒) | 10 |
119
119
  | `chengyuJielong.autoPlayMaxCount` | 机器人最大自动操作次数 | 5 |
120
120
  | `chengyuJielong.autoStopInactiveTime` | 游戏无操作自动停止时间(秒) | 60 |
@@ -184,7 +184,7 @@ This is a lightweight, multi-functional mini-game plugin developed for the Koish
184
184
  | `chengyuImage.rewardScore` | Reward score for correct answer | 1 |
185
185
  | **🐉 Idiom Solitaire Configuration** | | |
186
186
  | `chengyuJielong.totalRounds` | Total rounds | 10 |
187
- | `chengyuJielong.showRank` | Show rank after game ends | true |
187
+ | `chengyuJielong.showRank` | Show rank after game ends | false |
188
188
  | `chengyuJielong.autoPlayDelay` | Bot auto operation delay (seconds) | 10 |
189
189
  | `chengyuJielong.autoPlayMaxCount` | Bot maximum auto operation count | 5 |
190
190
  | `chengyuJielong.autoStopInactiveTime` | Auto stop time due to inactivity (seconds) | 60 |