From e09178e42e4222082931fbd5b66237bb5b98a22e Mon Sep 17 00:00:00 2001 From: hahwu <31872165+hahwu@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:03:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E6=85=B0=E8=AE=A2=E5=8D=95=E9=93=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/GoUtil/sliceUtil.go | 10 ++ src/server/game/Gm.go | 5 + src/server/game/Trigger.go | 37 +++++++ src/server/game/mod/base/Base.go | 6 +- src/server/game/mod/order/Order.go | 61 ++++++++---- src/server/game/mod/order/OrderFunc.go | 131 +++++++++++++++---------- 6 files changed, 179 insertions(+), 71 deletions(-) diff --git a/src/server/GoUtil/sliceUtil.go b/src/server/GoUtil/sliceUtil.go index 9e0239ca..f7ce0be9 100644 --- a/src/server/GoUtil/sliceUtil.go +++ b/src/server/GoUtil/sliceUtil.go @@ -259,3 +259,13 @@ func ShuffleArray(s []int) []int { } return r } + +func IsContain(s []int, s2 []int) bool { + for _, v := range s2 { + if !InArray(v, s) { + return false + } + s = SubSlices(s, []int{v}) + } + return true +} diff --git a/src/server/game/Gm.go b/src/server/game/Gm.go index b9a84662..65bbaac2 100644 --- a/src/server/game/Gm.go +++ b/src/server/game/Gm.go @@ -233,6 +233,11 @@ func ReqGmCommand(args []interface{}) error { case "addFriendStar": FriendTreasureMod := player.PlayMod.getFriendTreasureMod() FriendTreasureMod.AddStar(200) + case "comfortOrder": + BaseMod := player.PlayMod.getBaseMod() + BaseMod.LogoutTime = GoUtil.Now() - 7*86400 + TriggerComfortOrder(player) + player.PushClientRes(player.PlayMod.getOrderMod().BackData()) case "setDecorateArea": S, _ := strconv.Atoi(arg[1]) DecorateMod := player.PlayMod.getDecorateMod() diff --git a/src/server/game/Trigger.go b/src/server/game/Trigger.go index 0d5a38be..3931de2b 100644 --- a/src/server/game/Trigger.go +++ b/src/server/game/Trigger.go @@ -1,9 +1,11 @@ package game import ( + "server/GoUtil" "server/MergeConst" "server/conf" "server/db" + "server/game/mod/order" "server/msg" "server/pkg/github.com/name5566/leaf/log" "time" @@ -67,3 +69,38 @@ func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) { player.Kafka("pay", orderDataMap) player.SendClientRes() } + +func TriggerComfortOrder(p *Player) { + BaseMod := p.PlayMod.getBaseMod() + Now := GoUtil.Now() + Lv := BaseMod.GetLevel() + + if Now-BaseMod.GetLogoutTime() < 7*86400 || Lv < 6 { + return + } + OrderMod := p.PlayMod.getOrderMod() + ChessMod := p.PlayMod.getChessMod() + ChessList := ChessMod.GetUnlockChessList() + TriggerType := 1 + for _, Order := range OrderMod.GetOrderList() { + if GoUtil.IsContain(ChessList, Order.MergeId) { + continue + } + if Order.Diff == order.DIFF_LOW { + return + } + if Order.Diff == order.DIFF_MID { + TriggerType = 2 + } + } + EmitList := ChessMod.GetEmitList() + EnergyMul := BaseMod.GetEnergyMul() + if TriggerType == 1 { + OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_LOW, 2) + OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_LOW, 3) + OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_MID, 2) + } else { + OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_LOW, 2) + OrderMod.CreateComfortOrder(Lv, EmitList, EnergyMul, order.DIFF_LOW, 3) + } +} diff --git a/src/server/game/mod/base/Base.go b/src/server/game/mod/base/Base.go index 67993353..9d86418c 100644 --- a/src/server/game/mod/base/Base.go +++ b/src/server/game/mod/base/Base.go @@ -47,7 +47,7 @@ func (b *Base) InitData(Uid int) { func (b *Base) Login() { b.LoginTime = GoUtil.Now() - b.LogoutTime = 0 + // b.LogoutTime = 0 } func (b *Base) GetNickName() string { @@ -118,6 +118,10 @@ func (b *Base) GetLoginTime() int64 { return b.LoginTime } +func (b *Base) GetLogoutTime() int64 { + return b.LogoutTime +} + func (b *Base) GetRecoverTime() int64 { return b.RecoverTime } diff --git a/src/server/game/mod/order/Order.go b/src/server/game/mod/order/Order.go index 1e7904bc..4f06c7c4 100644 --- a/src/server/game/mod/order/Order.go +++ b/src/server/game/mod/order/Order.go @@ -40,12 +40,14 @@ const ( Super_type = 3 // 超级订单 Preheat_type = 4 // 预热订单 Trigger_type = 5 // 触发订单 - Clean_type = 6 // 清理订单 + Clean_type = 6 // 退役发射器清理订单 Clean_Order_type = 7 // 清理无法生成订单的棋子 + Clean_type2 = 8 // 棋盘空格不足清理棋子的订单 + COMFORT_TYPE = 9 // 安慰订单 - diff_low = 1 // 低难度 - diff_mid = 2 // 中难度 - diff_high = 3 // 高难度 + DIFF_LOW = 1 // 低难度 + DIFF_MID = 2 // 中难度 + DIFF_HIGH = 3 // 高难度 ) func (o *OrderMod) InitData() { @@ -60,7 +62,7 @@ func (o *OrderMod) InitData() { Cfg := startOrderCfg.GetStartOrderByStep(o.Step + 1) o.Step = 1 o.Auto_id = 0 - o.LastDiff = diff_low + o.LastDiff = DIFF_LOW for _, v := range Cfg { o.Auto_id++ o.OrderList[o.Auto_id] = Order{ @@ -120,7 +122,7 @@ func (o *OrderMod) CreateOrder(lv int, Emit []int, EnergyMul int) error { if NewChessId == 0 { return fmt.Errorf("CreateOrder: NewChessId is 0, EnergyMul: %d, PreheatStep: %d, ChessColor: %s", EnergyMul, PreheatStep, ChessColor) } - o.addOrder([]int{NewChessId}, diff_low, Preheat_type) + o.addOrder([]int{NewChessId}, DIFF_LOW, Preheat_type) o.PreheatStep[ChessColor]++ } default: @@ -137,7 +139,7 @@ func (o *OrderMod) CreateOrder(lv int, Emit []int, EnergyMul int) error { Cfg := startOrderCfg.GetStartOrderByStep(o.Step + 1) o.Step++ for _, v := range Cfg { - o.addOrder(v.MergeList, diff_low, Common_type) + o.addOrder(v.MergeList, DIFF_LOW, Common_type) } return nil } else { @@ -196,13 +198,13 @@ func (o *OrderMod) CreatePriorityOrder(lv int, Emit []int) bool { B := GoUtil.RandMap(map[int]int{0: 80, 1: 20}) if B == 1 { NewColor := GoUtil.RandStringSlice(Produce[1:]) - DiffLv := GoUtil.RandMap(map[int]int{diff_low: 70, diff_mid: 30}) + DiffLv := GoUtil.RandMap(map[int]int{DIFF_LOW: 70, DIFF_MID: 30}) NewChessId := 0 switch DiffLv { - case diff_low: + case DIFF_LOW: NewLv := GoUtil.RandNum(4, 3+DurLv) NewChessId = mergeDataCfg.GetChessIdByLvAndColor(NewLv, NewColor) - case diff_mid: + case DIFF_MID: NewLv := GoUtil.RandNum(4+DurLv, 3+DurLv*2) NewChessId = mergeDataCfg.GetChessIdByLvAndColor(NewLv, NewColor) } @@ -223,7 +225,7 @@ func (o *OrderMod) CreateNormalOrder(lv int, Emit []int, EnergyMul int) error { } randNum := 0 mergeList := make([]int, 0) - OrderDiff := diff_low + OrderDiff := DIFF_LOW var err error for { if randNum > 50 { @@ -259,7 +261,7 @@ func (o *OrderMod) CreateSuperOrder(lv int, Emit []int, EnergyMul int) error { } randNum := 0 mergeList := make([]int, 0) - OrderDiff := diff_low + OrderDiff := DIFF_LOW var err error for { if randNum > 50 { @@ -364,7 +366,7 @@ func (o *OrderMod) CreateTriggerOrder(lv int, Emit []int, EnergyMul int) (int, e } } if len(mergeList) > 0 { - o.addOrder(mergeList, diff_low, Trigger_type) + o.addOrder(mergeList, DIFF_LOW, Trigger_type) return getOrderStar(mergeList), nil } else { for k, v := range o.OrderList { @@ -402,12 +404,12 @@ func (o *OrderMod) addOrder(ChessList []int, Diff int, Type int) { } func (o *OrderMod) CreateCleanOrder(ChessList []int) bool { - o.addOrder(ChessList, diff_low, Clean_type) + o.addOrder(ChessList, DIFF_LOW, Clean_type) return true } func (o *OrderMod) CreateCleanOrder2(ChessList []int) bool { - o.addOrder(ChessList, diff_low, Clean_Order_type) + o.addOrder(ChessList, DIFF_LOW, Clean_Order_type) return true } @@ -445,7 +447,7 @@ func (o *OrderMod) CreateExtraOrder(AddChess, AddNewEmit, ChessList []int, Energ ChessId := mergeDataCfg.GetChessIdByLvAndColor(EnergyMul+1, ChessColor[0]) if ChessId != 0 { o.PreheatStep[ChessColor[0]] = 1 - o.addOrder([]int{ChessId}, diff_low, Preheat_type) + o.addOrder([]int{ChessId}, DIFF_LOW, Preheat_type) } } //额外订单补充2;当玩家的棋盘中出现三个相同的满级产物时,立刻生成一个对应的收购订单; @@ -453,7 +455,7 @@ func (o *OrderMod) CreateExtraOrder(AddChess, AddNewEmit, ChessList []int, Energ ChessNum := GoUtil.GetElemNum(ChessList, k) if ChessNum == 3 { b1 = true - o.addOrder([]int{k, k, k}, diff_low, Extra_type) + o.addOrder([]int{k, k, k}, DIFF_LOW, Extra_type) } } return b1 @@ -523,7 +525,7 @@ func (o *OrderMod) ChangeEnergyMul(lv int, Emit []int, EnergyMul int, ChessList continue } delete(o.OrderList, k) - o.addOrder([]int{NewChessId}, diff_low, Preheat_type) + o.addOrder([]int{NewChessId}, DIFF_LOW, Preheat_type) } if v.Type != Common_type { continue @@ -566,3 +568,26 @@ func (o *OrderMod) DelOrder(OrderId int) error { delete(o.OrderList, OrderId) return nil } + +func (o *OrderMod) CreateComfortOrder(lv int, Emit []int, EnergyMul, Diff, ChessNum int) error { + if len(Emit) == 0 { + return nil + } + randNum := 0 + mergeList := make([]int, 0) + var err error + for { + if randNum > 50 { + break + } + randNum++ + mergeList, _, err = randOrderChessWithDiff(o, lv, Emit, EnergyMul, Diff, ChessNum) + if err != nil { + continue + } + + break + } + o.addOrder(mergeList, Diff, COMFORT_TYPE) + return nil +} diff --git a/src/server/game/mod/order/OrderFunc.go b/src/server/game/mod/order/OrderFunc.go index b3a67035..9bfbc090 100644 --- a/src/server/game/mod/order/OrderFunc.go +++ b/src/server/game/mod/order/OrderFunc.go @@ -22,23 +22,23 @@ func getChessNumRand(OrderN int) map[int]int { func getOrderDiffRand(Diff, OrderN int) map[int]int { var d map[int]int switch Diff { - case diff_low: + case DIFF_LOW: d = map[int]int{ - diff_low: int(10 - OrderN), - diff_mid: int(30), - diff_high: int(60 + OrderN), + DIFF_LOW: int(10 - OrderN), + DIFF_MID: int(30), + DIFF_HIGH: int(60 + OrderN), } - case diff_mid: + case DIFF_MID: d = map[int]int{ - diff_low: int(21 - 3*OrderN), - diff_mid: int(49 + 1.5*float64(OrderN)), - diff_high: int(30 + 1.5*float64(OrderN)), + DIFF_LOW: int(21 - 3*OrderN), + DIFF_MID: int(49 + 1.5*float64(OrderN)), + DIFF_HIGH: int(30 + 1.5*float64(OrderN)), } - case diff_high: + case DIFF_HIGH: d = map[int]int{ - diff_low: int(60 - 5*OrderN), - diff_mid: int(30 + 3*float64(OrderN)), - diff_high: int(10 + 2*float64(OrderN)), + DIFF_LOW: int(60 - 5*OrderN), + DIFF_MID: int(30 + 3*float64(OrderN)), + DIFF_HIGH: int(10 + 2*float64(OrderN)), } } return d @@ -54,85 +54,85 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int { } case 2: switch OrderDiff { - case diff_low: + case DIFF_LOW: rand := map[int]int{ - diff_low: 99 - OrderN, - diff_mid: 1 + OrderN, + DIFF_LOW: 99 - OrderN, + DIFF_MID: 1 + OrderN, } secondDiff := GoUtil.RandMap(rand) rs = map[int]int{ - 1: diff_low, + 1: DIFF_LOW, 2: secondDiff, } - case diff_mid: + case DIFF_MID: rand := map[int]int{ - diff_low: 5 + OrderN, - diff_mid: 95 - OrderN, + DIFF_LOW: 5 + OrderN, + DIFF_MID: 95 - OrderN, } secondDiff := GoUtil.RandMap(rand) rs = map[int]int{ - 1: diff_low, + 1: DIFF_LOW, 2: secondDiff, } - case diff_high: + case DIFF_HIGH: rand := map[int]int{ - diff_low: int(95 - 10*OrderN), - diff_mid: int(4 + 6*OrderN), - diff_high: int(1 + 4*OrderN), + DIFF_LOW: int(95 - 10*OrderN), + DIFF_MID: int(4 + 6*OrderN), + DIFF_HIGH: int(1 + 4*OrderN), } secondDiff := GoUtil.RandMap(rand) rs = map[int]int{ - 1: diff_low, + 1: DIFF_LOW, 2: secondDiff, } } case 3: switch OrderDiff { - case diff_low: + case DIFF_LOW: rand := map[int]int{ - diff_low: 95 - OrderN, - diff_mid: 5 + OrderN, + DIFF_LOW: 95 - OrderN, + DIFF_MID: 5 + OrderN, } secondDiff := GoUtil.RandMap(rand) rand = map[int]int{ - diff_low: 60 - 4*OrderN, - diff_mid: 40 + 4*OrderN, + DIFF_LOW: 60 - 4*OrderN, + DIFF_MID: 40 + 4*OrderN, } thirdDiff := GoUtil.RandMap(rand) rs = map[int]int{ - 1: diff_low, + 1: DIFF_LOW, 2: secondDiff, 3: thirdDiff, } - case diff_mid: + case DIFF_MID: rand := map[int]int{ - diff_low: 50 - 3*OrderN, - diff_mid: 50 + 3*OrderN, + DIFF_LOW: 50 - 3*OrderN, + DIFF_MID: 50 + 3*OrderN, } secondDiff := GoUtil.RandMap(rand) rand = map[int]int{ - diff_mid: 95 - 4*OrderN, - diff_high: 5 + 4*OrderN, + DIFF_MID: 95 - 4*OrderN, + DIFF_HIGH: 5 + 4*OrderN, } thirdDiff := GoUtil.RandMap(rand) rs = map[int]int{ - 1: diff_low, + 1: DIFF_LOW, 2: secondDiff, 3: thirdDiff, } - case diff_high: + case DIFF_HIGH: rand := map[int]int{ - diff_low: int(95 - 10*OrderN), - diff_mid: int(5 + 10*OrderN), + DIFF_LOW: int(95 - 10*OrderN), + DIFF_MID: int(5 + 10*OrderN), } secondDiff := GoUtil.RandMap(rand) rand = map[int]int{ - diff_mid: int(95 - 8*OrderN), - diff_high: int(5 + 8*OrderN), + DIFF_MID: int(95 - 8*OrderN), + DIFF_HIGH: int(5 + 8*OrderN), } thirdDiff := GoUtil.RandMap(rand) rs = map[int]int{ - 1: diff_low, + 1: DIFF_LOW, 2: secondDiff, 3: thirdDiff, } @@ -146,12 +146,12 @@ func getChessLv(Min, Max, Diff int) int { Start := Min End := Max switch Diff { - case diff_low: + case DIFF_LOW: End = Min + (Max-Min+1)/3 - 1 - case diff_mid: + case DIFF_MID: Start = Min + (Max-Min+1)/3 End = Min + (Max-Min+1)/3*2 - 1 - case diff_high: + case DIFF_HIGH: Start = Min + (Max-Min+1)/3*2 } Start = max(Min, Start) @@ -217,11 +217,38 @@ func randSuperOrderChess(o *OrderMod, lv int, Emit []int, EnergyMul int) ([]int, 3: 30 + OrderN, } if err != nil { - return nil, diff_low, err + return nil, DIFF_LOW, err } // 生成订单难度和棋子数量 ChessNum := GoUtil.RandMap(RandChessNum) - OrderDiff := diff_high + OrderDiff := DIFF_HIGH + ChessDiff := getChessDiff(ChessNum, OrderDiff, OrderN) + mergeList := make([]int, 0, len(ChessDiff)) + // 根据订单棋子难度生成棋子 + for _, v := range ChessDiff { + ChessId := 0 + for { + ChessId = getChessFromPoolByDiff(o, v, Emit, EnergyMul) + if ChessId == 0 { + continue + } + if !GoUtil.InArray(ChessId, mergeList) { + break + } + } + mergeList = append(mergeList, ChessId) + } + return mergeList, OrderDiff, nil +} + +// 随机生成超级订单棋子 +func randOrderChessWithDiff(o *OrderMod, lv int, Emit []int, EnergyMul, OrderDiff, ChessNum int) ([]int, int, error) { + initReflectChess(Emit, EnergyMul) + filterPool(o) + OrderN, err := userCfg.GetOrderNByLv(lv) + if err != nil { + return nil, DIFF_LOW, err + } ChessDiff := getChessDiff(ChessNum, OrderDiff, OrderN) mergeList := make([]int, 0, len(ChessDiff)) // 根据订单棋子难度生成棋子 @@ -248,7 +275,7 @@ func randOrderChess(o *OrderMod, lv int, Emit []int, EnergyMul int) ([]int, int, OrderN, err := userCfg.GetOrderNByLv(lv) RandChessNum := getChessNumRand(OrderN) if err != nil { - return nil, diff_low, err + return nil, DIFF_LOW, err } // 生成订单难度和棋子数量 ChessNum := GoUtil.RandMap(RandChessNum) @@ -422,19 +449,19 @@ func initReflectChess(Emits []int, EnergyMul int) { End = ChessMinLv + (ChessMaxLv-ChessMinLv+1)/3 - 1 for _, v := range Product { Adjust := mergeDataCfg.DynamicAdjust(Emit, v) - initReflectChess2(v, Start, End, diff_low, Adjust) + initReflectChess2(v, Start, End, DIFF_LOW, Adjust) } Start = ChessMinLv + (ChessMaxLv-ChessMinLv+1)/3 End = ChessMinLv + (ChessMaxLv-ChessMinLv+1)/3*2 - 1 for _, v := range Product { Adjust := mergeDataCfg.DynamicAdjust(Emit, v) - initReflectChess2(v, Start, End, diff_mid, Adjust) + initReflectChess2(v, Start, End, DIFF_MID, Adjust) } Start = ChessMinLv + (ChessMaxLv-ChessMinLv+1)/3*2 End = ChessMaxLv for _, v := range Product { Adjust := mergeDataCfg.DynamicAdjust(Emit, v) - initReflectChess2(v, Start, End, diff_high, Adjust) + initReflectChess2(v, Start, End, DIFF_HIGH, Adjust) } } }