Skip to content

Commit

Permalink
[新增插件]钓鱼模拟器 (#721)
Browse files Browse the repository at this point in the history
* Add files via upload

* Update README.md

* Add files via upload

* Add files via upload

* Update pole.go

* Update pole.go

* Update main.go

* Add files via upload

* Add files via upload

* Update main.go

* Update pack.go

* Add files via upload
  • Loading branch information
fangliuyu authored Sep 3, 2023
1 parent 6bff62b commit b7e21fc
Show file tree
Hide file tree
Showing 6 changed files with 2,464 additions and 0 deletions.
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -959,6 +959,23 @@ print("run[CQ:image,file="+j["img"]+"]")

- [x] 吟唱提示[xxxx]

</details>
<details>
<summary>钓鱼模拟器</summary>

`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/mcfish"`

- [x] 钓鱼商店
- [x] 购买xxx [数量]
- [x] 出售xxx [数量]
- [x] 钓鱼背包
- [x] 装备[xx竿|三叉戟|美西螈]
- [x] 附魔[诱钓|海之眷顾]
- [x] 修复鱼竿
- [x] 合成[xx竿|三叉戟]
- [x] 进行钓鱼
- [x] 进行n次钓鱼

</details>
<details>
<summary>简易midi音乐制作</summary>
Expand Down
329 changes: 329 additions & 0 deletions plugin/mcfish/fish.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,329 @@
// Package mcfish 钓鱼模拟器
package mcfish

import (
"math/rand"
"strconv"
"strings"
"time"

"github.com/FloatTech/AnimeAPI/wallet"
"github.com/FloatTech/zbputils/ctxext"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)

func init() {
engine.OnRegex(`^进行(([1-5]\d|[1-9])次)?钓鱼$`, getdb).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
uid := ctx.Event.UserID
fishNumber := 1
info := ctx.State["regex_matched"].([]string)[2]
if info != "" {
number, err := strconv.Atoi(info)
if err != nil || number > FishLimit {
ctx.SendChain(message.Text("请输入正确的次数"))
return
}
fishNumber = number
}
equipInfo, err := dbdata.getUserEquip(uid)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.2]:", err))
return
}
if equipInfo == (equip{}) {
ok, err := dbdata.checkEquipFor(uid)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.2.1]:", err))
return
}
if !ok {
ctx.SendChain(message.At(uid), message.Text("请装备鱼竿后钓鱼", err))
return
}
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("你尚未装备鱼竿,是否花费100购买鱼竿?\n回答\"\"\"\""))
// 等待用户下一步选择
recv, cancel := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`^(是|否)$`), zero.CheckUser(ctx.Event.UserID)).Repeat()
defer cancel()
buy := false
for {
select {
case <-time.After(time.Second * 120):
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("等待超时,取消钓鱼")))
return
case e := <-recv:
nextcmd := e.Event.Message.String()
if nextcmd == "否" {
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("已取消购买")))
return
}
money := wallet.GetWalletOf(uid)
if money < 100 {
ctx.SendChain(message.Text("你钱包当前只有", money, "ATRI币,无法完成支付"))
return
}
err = wallet.InsertWalletOf(uid, -100)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.3]:", err))
return
}
equipInfo = equip{
ID: uid,
Equip: "木竿",
Durable: 30,
}
err = dbdata.updateUserEquip(equipInfo)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.4]:", err))
return
}
err = dbdata.setEquipFor(uid)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.4]:", err))
return
}
buy = true
}
if buy {
break
}
}
}
if equipInfo.Durable < fishNumber {
fishNumber = equipInfo.Durable
}
residue, err := dbdata.updateFishInfo(uid, fishNumber)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.1]:", err))
return
}
if residue == 0 {
ctx.SendChain(message.Text("今天你已经进行", FishLimit, "次钓鱼了.\n游戏虽好,但请不要沉迷。"))
return
}
fishNumber = residue
msg := ""
if equipInfo.Equip != "美西螈" {
equipInfo.Durable -= fishNumber
err = dbdata.updateUserEquip(equipInfo)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.5]:", err))
return
}
if equipInfo.Durable < 10 || equipInfo.Durable > 0 {
msg = "(你的鱼竿耐久仅剩" + strconv.Itoa(equipInfo.Durable) + ")"
} else if equipInfo.Durable <= 0 {
msg = "(你的鱼竿耐已销毁)"
}
} else {
fishNmaes, err := dbdata.pickFishFor(uid, fishNumber)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.5.1]:", err))
return
}
if len(fishNmaes) == 0 {
equipInfo.Durable = 0
err = dbdata.updateUserEquip(equipInfo)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.5]:", err))
}
ctx.SendChain(message.Text("美西螈因为没吃到鱼,钓鱼时一直没回来,你失去了美西螈"))
return
}
msg = "(美西螈吃掉了"
fishNumber = 0
for name, number := range fishNmaes {
fishNumber += number
msg += strconv.Itoa(number) + name + "、"
}
msg += ")"
}
waitTime := 120 / (equipInfo.Induce + 1)
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("你开始去钓鱼了,请耐心等待鱼上钩(预计要", time.Second*time.Duration(waitTime), ")"))
timer := time.NewTimer(time.Second * time.Duration(rand.Intn(waitTime)+1))
for {
<-timer.C
timer.Stop()
break
}
// 钓到鱼的范围
number, err := dbdata.getNumberFor(uid, "鱼")
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.5.1]:", err))
return
}
if number > 100 || equipInfo.Equip == "美西螈" { //放大概率
probabilities["treasure"] = probabilityLimit{
Min: 0,
Max: 2,
}
probabilities["pole"] = probabilityLimit{
Min: 2,
Max: 10,
}
probabilities["fish"] = probabilityLimit{
Min: 10,
Max: 45,
}
probabilities["waste"] = probabilityLimit{
Min: 45,
Max: 90,
}
}
for name, info := range probabilities {
switch name {
case "treasure":
info.Max += equipInfo.Favor
probabilities[name] = info
case "pole":
info.Min += equipInfo.Favor
info.Max += equipInfo.Favor * 2
probabilities[name] = info
case "fish":
info.Min += equipInfo.Favor * 2
info.Max += equipInfo.Favor * 3
probabilities[name] = info
case "waste":
info.Min += equipInfo.Favor * 3
probabilities[name] = info
}
}
// 钓鱼结算
picName := ""
thingNameList := make(map[string]int)
for i := fishNumber; i > 0; i-- {
thingName := ""
typeOfThing := ""
number := 1
dice := rand.Intn(100)
switch {
case dice <= probabilities["waste"].Min && dice < probabilities["waste"].Max: // 垃圾
typeOfThing = "waste"
thingName = wasteList[rand.Intn(len(wasteList))]
picName = thingName
case dice <= probabilities["treasure"].Min && dice < probabilities["treasure"].Max: // 宝藏
dice = rand.Intn(100)
switch {
case dice <= probabilities["美西螈"].Min && dice < probabilities["美西螈"].Max:
typeOfThing = "pole"
picName = "美西螈"
thingName = "美西螈"
case dice <= probabilities["唱片"].Min && dice < probabilities["唱片"].Max:
typeOfThing = "article"
picName = "唱片"
thingName = "唱片"
case dice <= probabilities["海之眷顾"].Min && dice < probabilities["海之眷顾"].Max:
typeOfThing = "article"
picName = "book"
thingName = "海之眷顾"
default:
typeOfThing = "article"
picName = "book"
thingName = "诱钓"
}
case dice <= probabilities["pole"].Min && dice < probabilities["pole"].Max: // 宝藏
typeOfThing = "pole"
dice := rand.Intn(100)
switch {
case dice <= probabilities["铁竿"].Min && dice < probabilities["铁竿"].Max:
thingName = "铁竿"
case dice <= probabilities["金竿"].Min && dice < probabilities["金竿"].Max:
thingName = "金竿"
case dice <= probabilities["钻石竿"].Min && dice < probabilities["钻石竿"].Max:
thingName = "钻石竿"
case dice <= probabilities["下界合金竿竿竿"].Min && dice < probabilities["下界合金竿竿竿"].Max:
thingName = "下界合金竿竿竿"
default:
thingName = "木竿"
}
picName = thingName
case dice <= probabilities["fish"].Min && dice < probabilities["fish"].Max:
typeOfThing = "fish"
dice = rand.Intn(100)
switch {
case dice <= probabilities["墨鱼"].Min && dice < probabilities["墨鱼"].Max:
thingName = "墨鱼"
case dice <= probabilities["鳕鱼"].Min && dice < probabilities["鳕鱼"].Max:
thingName = "鳕鱼"
case dice <= probabilities["鲑鱼"].Min && dice < probabilities["鲑鱼"].Max:
thingName = "鲑鱼"
case dice <= probabilities["热带鱼"].Min && dice < probabilities["热带鱼"].Max:
thingName = "热带鱼"
case dice <= probabilities["河豚"].Min && dice < probabilities["河豚"].Max:
thingName = "河豚"
default:
thingName = "鹦鹉螺"
}
picName = thingName
default:
thingNameList["赛博空气"]++
}
if thingName != "" {
newThing := article{}
if strings.Contains(thingName, "竿") {
info := strconv.Itoa(rand.Intn(discountList[thingName])+1) +
"/" + strconv.Itoa(rand.Intn(10)) + "/" +
strconv.Itoa(rand.Intn(3)) + "/" + strconv.Itoa(rand.Intn(2))
newThing = article{
Duration: time.Now().Unix()*100 + int64(i),
Type: typeOfThing,
Name: thingName,
Number: number,
Other: info,
}
} else {
thingInfo, err := dbdata.getUserThingInfo(uid, thingName)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.6]:", err))
return
}
if len(thingInfo) == 0 {
newThing = article{
Duration: time.Now().Unix()*100 + int64(i),
Type: typeOfThing,
Name: thingName,
}
} else {
newThing = thingInfo[0]
}
if equipInfo.Equip == "美西螈" && thingName != "美西螈" {
number += 2
}
newThing.Number += number
}
err = dbdata.updateUserThingInfo(uid, newThing)
if err != nil {
ctx.SendChain(message.Text("[ERROR at fish.go.7]:", err))
return
}
thingNameList[thingName] += number
}
}
if len(thingNameList) == 1 {
thingName := ""
for name := range thingNameList {
thingName = name
}
if picName != "" {
pic, err := engine.GetLazyData(picName+".png", false)
if err != nil {
logrus.Warnln("[mcfish]error:", err)
ctx.SendChain(message.At(uid), message.Text("恭喜你钓到了", thingName, "\n", msg))
return
}
ctx.SendChain(message.At(uid), message.Text("恭喜你钓到了", thingName, "\n", msg), message.ImageBytes(pic))
return
}
ctx.SendChain(message.At(uid), message.Text("恭喜你钓到了", thingName, "\n", msg))
return
}
msgInfo := make(message.Message, 0, 3+len(thingNameList))
msgInfo = append(msgInfo, message.Reply(ctx.Event.MessageID), message.Text("你进行了", fishNumber, "次钓鱼,结果如下:\n"))
for name, number := range thingNameList {
msgInfo = append(msgInfo, message.Text(name, " : ", number, "\n"))
}
msgInfo = append(msgInfo, message.Text(msg))
ctx.Send(msgInfo)
})
}
Loading

0 comments on commit b7e21fc

Please sign in to comment.