diff --git a/plugin/mcfish/fish.go b/plugin/mcfish/fish.go index 29cf4cf605..72b5b477cf 100644 --- a/plugin/mcfish/fish.go +++ b/plugin/mcfish/fish.go @@ -171,45 +171,51 @@ func init() { ctx.SendChain(message.Text("[ERROR at fish.go.5.1]:", err)) return } + + localProbabilities := make(map[string]probabilityLimit, len(probabilities)) + for k, v := range probabilities { + localProbabilities[k] = v + } + if number > 100 || equipInfo.Equip == "美西螈" { // 放大概率 - probabilities["treasure"] = probabilityLimit{ + localProbabilities["treasure"] = probabilityLimit{ Min: 0, Max: 2, } - probabilities["pole"] = probabilityLimit{ + localProbabilities["pole"] = probabilityLimit{ Min: 2, Max: 10, } - probabilities["fish"] = probabilityLimit{ + localProbabilities["fish"] = probabilityLimit{ Min: 10, Max: 45, } - probabilities["waste"] = probabilityLimit{ + localProbabilities["waste"] = probabilityLimit{ Min: 45, Max: 90, } } if number2 != 0 { - info := probabilities["waste"] + info := localProbabilities["waste"] info.Max = 100 - probabilities["waste"] = info + localProbabilities["waste"] = info } - for name, info := range probabilities { + for name, info := range localProbabilities { switch name { case "treasure": info.Max += equipInfo.Favor - probabilities[name] = info + localProbabilities[name] = info case "pole": info.Min += equipInfo.Favor info.Max += equipInfo.Favor * 2 - probabilities[name] = info + localProbabilities[name] = info case "fish": info.Min += equipInfo.Favor * 2 info.Max += equipInfo.Favor * 3 - probabilities[name] = info + localProbabilities[name] = info case "waste": info.Min += equipInfo.Favor * 3 - probabilities[name] = info + localProbabilities[name] = info } } // 钓鱼结算 @@ -221,34 +227,34 @@ func init() { number := 1 dice := rand.Intn(100) switch { - case dice >= probabilities["waste"].Min && dice < probabilities["waste"].Max: // 垃圾 + case dice >= localProbabilities["waste"].Min && dice < localProbabilities["waste"].Max: // 垃圾 typeOfThing = "waste" thingName = wasteList[rand.Intn(len(wasteList))] picName = thingName - case dice >= probabilities["treasure"].Min && dice < probabilities["treasure"].Max: // 宝藏 + case dice >= localProbabilities["treasure"].Min && dice < localProbabilities["treasure"].Max: // 宝藏 dice = rand.Intn(100) switch { - case dice >= probabilities["美西螈"].Min && dice < probabilities["美西螈"].Max: + case dice >= localProbabilities["美西螈"].Min && dice < localProbabilities["美西螈"].Max: typeOfThing = "pole" picName = "美西螈" thingName = "美西螈" - case dice >= probabilities["唱片"].Min && dice < probabilities["唱片"].Max: + case dice >= localProbabilities["唱片"].Min && dice < localProbabilities["唱片"].Max: typeOfThing = "article" picName = "唱片" thingName = "唱片" - case dice >= probabilities["海之眷顾"].Min && dice < probabilities["海之眷顾"].Max: + case dice >= localProbabilities["海之眷顾"].Min && dice < localProbabilities["海之眷顾"].Max: typeOfThing = "article" picName = "book" thingName = "海之眷顾" - case dice >= probabilities["净化书"].Min && dice < probabilities["净化书"].Max: + case dice >= localProbabilities["净化书"].Min && dice < localProbabilities["净化书"].Max: typeOfThing = "article" picName = "book" thingName = "净化书" - case dice >= probabilities["宝藏诅咒"].Min && dice < probabilities["宝藏诅咒"].Max: + case dice >= localProbabilities["宝藏诅咒"].Min && dice < localProbabilities["宝藏诅咒"].Max: typeOfThing = "article" picName = "book" thingName = "宝藏诅咒" - case dice >= probabilities["海豚"].Min && dice < probabilities["海豚"].Max: + case dice >= localProbabilities["海豚"].Min && dice < localProbabilities["海豚"].Max: typeOfThing = "fish" picName = "海豚" thingName = "海豚" @@ -257,35 +263,35 @@ func init() { picName = "book" thingName = "诱钓" } - case dice >= probabilities["pole"].Min && dice < probabilities["pole"].Max: // 宝藏 + case dice >= localProbabilities["pole"].Min && dice < localProbabilities["pole"].Max: // 鱼竿 typeOfThing = "pole" dice := rand.Intn(100) switch { - case dice >= probabilities["铁竿"].Min && dice < probabilities["铁竿"].Max: + case dice >= localProbabilities["铁竿"].Min && dice < localProbabilities["铁竿"].Max: thingName = "铁竿" - case dice >= probabilities["金竿"].Min && dice < probabilities["金竿"].Max: + case dice >= localProbabilities["金竿"].Min && dice < localProbabilities["金竿"].Max: thingName = "金竿" - case dice >= probabilities["钻石竿"].Min && dice < probabilities["钻石竿"].Max: + case dice >= localProbabilities["钻石竿"].Min && dice < localProbabilities["钻石竿"].Max: thingName = "钻石竿" - case dice >= probabilities["下界合金竿"].Min && dice < probabilities["下界合金竿"].Max: + case dice >= localProbabilities["下界合金竿"].Min && dice < localProbabilities["下界合金竿"].Max: thingName = "下界合金竿" default: thingName = "木竿" } picName = thingName - case dice >= probabilities["fish"].Min && dice < probabilities["fish"].Max: + case dice >= localProbabilities["fish"].Min && dice < localProbabilities["fish"].Max: // 鱼类 typeOfThing = "fish" dice = rand.Intn(100) switch { - case dice >= probabilities["墨鱼"].Min && dice < probabilities["墨鱼"].Max: + case dice >= localProbabilities["墨鱼"].Min && dice < localProbabilities["墨鱼"].Max: thingName = "墨鱼" - case dice >= probabilities["鳕鱼"].Min && dice < probabilities["鳕鱼"].Max: + case dice >= localProbabilities["鳕鱼"].Min && dice < localProbabilities["鳕鱼"].Max: thingName = "鳕鱼" - case dice >= probabilities["鲑鱼"].Min && dice < probabilities["鲑鱼"].Max: + case dice >= localProbabilities["鲑鱼"].Min && dice < localProbabilities["鲑鱼"].Max: thingName = "鲑鱼" - case dice >= probabilities["热带鱼"].Min && dice < probabilities["热带鱼"].Max: + case dice >= localProbabilities["热带鱼"].Min && dice < localProbabilities["热带鱼"].Max: thingName = "热带鱼" - case dice >= probabilities["河豚"].Min && dice < probabilities["河豚"].Max: + case dice >= localProbabilities["河豚"].Min && dice < localProbabilities["河豚"].Max: thingName = "河豚" default: thingName = "鹦鹉螺" diff --git a/plugin/mcfish/pole.go b/plugin/mcfish/pole.go index cad6938975..228f15baea 100644 --- a/plugin/mcfish/pole.go +++ b/plugin/mcfish/pole.go @@ -419,12 +419,59 @@ func init() { return } if nextcmd == "梭哈" { - // len(list)取3的倍数,表示能够用于合成鱼竿的最大数量,note:此处未对article.Number>1的情况做处理 - for i := 3; i < (len(articles)/3)*3; i++ { - list = append(list, i) + totalBatches := maxCount / 3 + success := 0 + fail := 0 + for batch := 0; batch < totalBatches; batch++ { + base := batch * 3 + indices := []int{base, base + 1, base + 2} + sumInduce := 0 + sumFavor := 0 + for _, idx := range indices { + sumInduce += poles[idx].Induce + sumFavor += poles[idx].Favor + } + avgInduce := sumInduce / 3 + avgFavor := sumFavor / 3 + for _, idx := range indices { + thingInfo := articles[idx] + thingInfo.Number = 0 + err = dbdata.updateUserThingInfo(uid, thingInfo) + if err != nil { + ctx.SendChain(message.Text("[ERROR at pole.go.12]:", err)) + return + } + } + if rand.Intn(100) < 90 { + attribute := strconv.Itoa(durationList[thingName]) + "/0/" + strconv.Itoa(avgInduce) + "/" + strconv.Itoa(avgFavor) + newthing := article{ + Duration: time.Now().Unix() + int64(batch*10), + Type: "pole", + Name: thingName, + Number: 1, + Other: attribute, + } + err = dbdata.updateUserThingInfo(uid, newthing) + if err != nil { + ctx.SendChain(message.Text("[ERROR at pole.go.12]:", err)) + return + } + success++ + } else { + fail++ + } } - check = true - break + remaining := maxCount % 3 + msgText := "合成完成,成功:" + strconv.Itoa(success) + " 个,失败:" + strconv.Itoa(fail) + " 个" + if remaining > 0 { + msgText += ",剩余 " + strconv.Itoa(remaining) + " 根材料未参与合成" + } + ctx.Send( + message.ReplyWithMessage(ctx.Event.MessageID, + message.Text(msgText), + ), + ) + return } chooseList := strings.Split(nextcmd, " ") first, err := strconv.Atoi(chooseList[0]) diff --git a/plugin/qqwife/function.go b/plugin/qqwife/function.go index dd9a339288..a9fd834002 100644 --- a/plugin/qqwife/function.go +++ b/plugin/qqwife/function.go @@ -162,7 +162,6 @@ func init() { message.Text( "\n", "[", ctx.CardOrNickName(fiancee), "]", - "(", fiancee, ")哒", "(", fiancee, ")哒\n当前你们好感度为", favor, ), ) diff --git a/plugin/wife/main.go b/plugin/wife/main.go index dd60d86382..8cf8178832 100644 --- a/plugin/wife/main.go +++ b/plugin/wife/main.go @@ -29,15 +29,19 @@ var ( func(ctx *zero.Ctx) bool { data, err := engine.GetLazyData("wife.json", true) if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return false + logrus.Warnf("[wife] 远程同步 wife.json 失败: %v,正在尝试读取本地缓存...", err) + data, err = engine.GetLazyData("wife.json", false) + if err != nil { + ctx.SendChain(message.Text("ERROR: 无法获取老婆库数据(同步及本地读取均失败): ", err)) + return false + } } err = json.Unmarshal(data, &cards) if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) + ctx.SendChain(message.Text("ERROR: 老婆库格式解析失败: ", err)) return false } - logrus.Infof("[wife]加载%d个老婆", len(cards)) + logrus.Infof("[wife] 已成功加载 %d 个老婆", len(cards)) return true }, ) diff --git a/plugin/wife/wifegame.go b/plugin/wife/wifegame.go index a31e2ac573..b1b5b4bc5f 100644 --- a/plugin/wife/wifegame.go +++ b/plugin/wife/wifegame.go @@ -15,6 +15,7 @@ import ( "github.com/wdvxdr1123/ZeroBot/message" "github.com/FloatTech/imgfactory" + "github.com/sirupsen/logrus" ) var ( @@ -33,14 +34,18 @@ func init() { card := cards[rand.Intn(len(cards))] pic, err := engine.GetLazyData("wives/"+card, true) if err != nil { - ctx.SendChain(message.Text("[猜老婆]error:\n", err)) - return + logrus.Warnf("[wife] 猜老婆图片同步失败: %v,尝试读取本地文件...", err) + pic, err = engine.GetLazyData("wives/"+card, false) + if err != nil { + ctx.SendChain(message.Text("[猜老婆] 远程下载及本地读取图片均失败:\n", err)) + return + } } work, name := card2name(card) name = strings.ToLower(name) img, _, err := image.Decode(bytes.NewReader(pic)) if err != nil { - ctx.SendChain(message.Text("[猜老婆]error:\n", err)) + ctx.SendChain(message.Text("[猜老婆] 图片解码失败:\n", err)) return } dst := imgfactory.Size(img, img.Bounds().Dx(), img.Bounds().Dy()) @@ -48,7 +53,7 @@ func init() { if err != nil { ctx.SendChain( message.Reply(ctx.Event.MessageID), - message.Text("[猜老婆]图片生成失败:\n", err), + message.Text("[猜老婆] 图片生成失败:\n", err), ) return } @@ -80,8 +85,6 @@ func init() { ) return case c := <-recv: - // tick.Reset(105 * time.Second) - // after.Reset(120 * time.Second) msg := strings.ReplaceAll(c.Event.Message.String(), "酱", "") if msg == "" { continue