From 1f834cd36abbda9d2cd9d18cec6c40eb13637f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AD=B1=E5=82=91?= <840465812@qq.com> Date: Tue, 11 Jan 2022 19:54:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E6=AF=94=E8=B5=9B?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E8=87=AA=E5=8A=A8=E5=BC=80=E5=A7=8B=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4=20=E7=8E=B0=E5=9C=A8=E5=BD=93=E5=A4=9A?= =?UTF-8?q?=E5=8C=B9=E9=A9=AC=E5=90=8C=E6=97=B6=E8=8E=B7=E8=83=9C=EF=BC=8C?= =?UTF-8?q?=E5=B0=86=E5=90=8C=E6=97=B6=E5=BE=97=E5=88=B0=E5=A5=96=E5=8A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/JHRPluginConfig.kt | 6 ++ src/main/kotlin/JHorseRacing.kt | 142 ++++++++++++++++------------- 2 files changed, 84 insertions(+), 64 deletions(-) diff --git a/src/main/kotlin/JHRPluginConfig.kt b/src/main/kotlin/JHRPluginConfig.kt index 534e481..f224de2 100644 --- a/src/main/kotlin/JHRPluginConfig.kt +++ b/src/main/kotlin/JHRPluginConfig.kt @@ -62,6 +62,12 @@ object JHRPluginConfig : AutoSavePluginConfig("HorseRacingPluginConfig") { ) ) + + /** + * 自动开始时间(s) + */ + @ValueDescription("自动开始时间(s)") + var autoStartTime by value(180) } // @ValueDescription("赛马数量") // val horseCount by value(5) \ No newline at end of file diff --git a/src/main/kotlin/JHorseRacing.kt b/src/main/kotlin/JHorseRacing.kt index ffb3666..cf8ed9f 100644 --- a/src/main/kotlin/JHorseRacing.kt +++ b/src/main/kotlin/JHorseRacing.kt @@ -7,11 +7,15 @@ import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register import net.mamoe.mirai.console.command.CommandManager.INSTANCE.unregister import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin +import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.isOperator import net.mamoe.mirai.event.GlobalEventChannel -import net.mamoe.mirai.event.events.* -import net.mamoe.mirai.message.data.* +import net.mamoe.mirai.event.events.GroupMessageEvent +import net.mamoe.mirai.event.events.MessageEvent +import net.mamoe.mirai.message.data.At +import net.mamoe.mirai.message.data.MessageChainBuilder import net.mamoe.mirai.message.data.MessageSource.Key.quote +import net.mamoe.mirai.message.data.PlainText import net.mamoe.mirai.utils.info import java.util.* import kotlin.random.Random @@ -66,7 +70,6 @@ object JHorseRacing : KotlinPlugin( "\uD83D\uDC1C" ) private val ranks = mutableMapOf() - private fun newRank(job: Job) = Rank(List(horseCount) { Horse(Random.nextInt(horseTypes.size)) }, job) private fun drawHorse(horses: List): String { val sb = StringBuilder() for ((i, horse) in horses.withIndex()) { @@ -80,6 +83,69 @@ object JHorseRacing : KotlinPlugin( } return sb.toString() } + private suspend fun startRank(subject: Group) { + if (ranks[subject.id] != null) return + subject.sendMessage("赛马开始辣,走过路过不要错过") + val rank = Rank(List(horseCount) { Horse(Random.nextInt(horseTypes.size)) }, Job()) + ranks[subject.id] = rank + subject.sendMessage(drawHorse(rank.horses)) + launch(rank.job) { + val winners = mutableListOf() + while (winners.size == 0) { + delay(Random.nextLong(1000) + 2000) + // 比赛事件触发 + val steps = (1..3).random() //事件触发前进或后退随机大小 + val eventHorseIndex = Random.nextInt(rank.horses.size) + val eventHorse = rank.horses[eventHorseIndex] + val eventMsg = if (Random.nextInt(77) > 32) { + eventHorse.position += steps + JHRPluginConfig.goodEvents[Random.nextInt(JHRPluginConfig.goodEvents.size)] + } else { + eventHorse.position -= steps + JHRPluginConfig.badEvents[Random.nextInt(JHRPluginConfig.badEvents.size)] + } + val number = (eventHorseIndex + 1).toString() + subject.sendMessage( + eventMsg + .replace("?", number) + .replace("?", number) + ) + + // 所有马前进 + for ((i, horse) in rank.horses.withIndex()) { + if (++horse.position >= lapLength) { + winners.add(i + 1) + } + } + subject.sendMessage(drawHorse(rank.horses)) + + delay(Random.nextLong(1000) + 3000) + } + val mb = MessageChainBuilder() + if (winners.size == 1) { + mb.add("${winners[0]}最终赢得了胜利,让我们为它鼓掌") + } else { + mb.add("${winners.joinToString()}一起赢得了胜利,让我们为它们鼓掌") + } + ranks.remove(subject.id) + val pool = pools.remove(subject.id) + if (pool != null && pool.size > 0) { + for (bet in pool) { + val score = JHRPluginData.Scores[bet.id]!! + val income = if (winners.indexOf(bet.number) != -1) { + (bet.score * 1.5).toInt() + } else { + -bet.score + } + JHRPluginData.Scores[bet.id] = score + income + mb.add("\n") + mb.add(At(bet.id)) + mb.add(PlainText("收益${income}")) + } + } + subject.sendMessage(mb.asMessageChain()) + } + } // endregion @@ -107,69 +173,17 @@ object JHorseRacing : KotlinPlugin( if (pools[subject.id] != null) { subject.sendMessage("已经有比赛在进行了") } else { - pools[subject.id] = mutableListOf() - subject.sendMessage("赛马比赛开盘,有钱交钱妹钱交人") - } - } - msg.startsWith("开始赛马") -> { - if (ranks[subject.id] != null) return@subscribeAlways - subject.sendMessage("赛马开始辣,走过路过不要错过") - val rank = newRank(Job()) - ranks[subject.id] = rank - subject.sendMessage(drawHorse(rank.horses)) - launch(rank.job) { - var winner = -1 - while (winner == -1) { - delay(Random.nextLong(1000) + 2000) - // 比赛事件触发 - val steps = (1..3).random() //事件触发前进或后退随机大小 - val eventHorseIndex = Random.nextInt(rank.horses.size) - val eventHorse = rank.horses[eventHorseIndex] - val eventMsg = if (Random.nextInt(77) > 32) { - eventHorse.position += steps - JHRPluginConfig.goodEvents[Random.nextInt(JHRPluginConfig.goodEvents.size)] - } else { - eventHorse.position -= steps - JHRPluginConfig.badEvents[Random.nextInt(JHRPluginConfig.badEvents.size)] - } - val number = (eventHorseIndex + 1).toString() - subject.sendMessage( - eventMsg - .replace("?", number) - .replace("?", number) - ) - - // 所有马前进 - for ((i, horse) in rank.horses.withIndex()) { - if (++horse.position >= lapLength) { - winner = i + 1 - } - } - subject.sendMessage(drawHorse(rank.horses)) - - delay(Random.nextLong(1000) + 3000) - } - val mb = MessageChainBuilder() - mb.add("${winner}最终赢得了胜利,让我们为它鼓掌") - ranks.remove(subject.id) - val pool = pools.remove(subject.id) - if (pool != null && pool.size > 0) { - for (bet in pool) { - val score = JHRPluginData.Scores[bet.id]!! - val income = if (bet.number == winner) { - (bet.score * 1.5).toInt() - } else { - -bet.score - } - JHRPluginData.Scores[bet.id] = score + income - mb.add("\n") - mb.add(At(bet.id)) - mb.add(PlainText("收益${income}")) - } - } - subject.sendMessage(mb.asMessageChain()) + val pool = mutableListOf() + pools[subject.id] = pool + subject.sendMessage("赛马比赛开盘,有钱交钱妹钱交人。\n${JHRPluginConfig.autoStartTime}秒后将自动开始") + launch { + delay(JHRPluginConfig.autoStartTime * 1000L) + if (pools[subject.id] == pool) + startRank(subject) + } } } + msg.startsWith("开始赛马") -> launch { startRank(subject) } msg == "关闭赛马" -> { if (sender.permission.isOperator()) { JHRPluginConfig.enabledGroups.remove(subject.id)