diff --git a/src/server/conf/mergeData/MergeDataCfg.go b/src/server/conf/mergeData/MergeDataCfg.go index 13d88283..516c2db5 100644 --- a/src/server/conf/mergeData/MergeDataCfg.go +++ b/src/server/conf/mergeData/MergeDataCfg.go @@ -45,10 +45,10 @@ func GetEmitTypeByColor(Color string) string { if err != nil { return "" } - for _, v := range data { - ColorList := strings.Split(gamedata.GetStringValue(data, "Order_Type"), ",") + for k, v := range data { + ColorList := strings.Split(gamedata.GetStringValue(v, "Order_Type"), ",") if GoUtil.InStringArray(Color, ColorList) { - return gamedata.GetStringValue(v, "Type") + return k } } return "" diff --git a/src/server/game/Trigger.go b/src/server/game/Trigger.go index 6e642aa0..55e52ef4 100644 --- a/src/server/game/Trigger.go +++ b/src/server/game/Trigger.go @@ -2,6 +2,7 @@ package game import ( "encoding/json" + "fmt" "math" "server/GoUtil" "server/MergeConst" @@ -110,6 +111,7 @@ func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) { } } if OrderData == nil { + GoUtil.SendFeishuFatal(int(player.M_DwUin), "GoogleVerify支付校验异常", fmt.Sprintf("GoogleVerify parmas OrderSn:%s; ProduceId:%s; Token:%s", OrderSn, req.ProduceId, req.Token)) log.Debug("[order data nil] Uid:%d;OrderSn:%s;PayOrder:%s;", player.M_DwUin, OrderSn, req.ProduceId) return } @@ -132,6 +134,7 @@ func TriggerShippingOrder(player *Player, req *msg.ReqShippingOrder) { } OrderData.PayStatus = MergeConst.ORDER_STATUS_SHIP OrderData.PayChannelOrderId = req.Token + OrderData.ProductDesc = req.ProduceId db.UpdatePlayerChargeData(OrderData) player.PlayMod.save() orderDataMap := map[string]interface{}{ diff --git a/src/server/game/UnitTest.go b/src/server/game/UnitTest.go index 2a8ead48..4b492d16 100644 --- a/src/server/game/UnitTest.go +++ b/src/server/game/UnitTest.go @@ -44,16 +44,71 @@ func UnitOrder(p *Player) error { OrderMod := p.PlayMod.getOrderMod() ChessMod := p.PlayMod.getChessMod() BaseMod := p.PlayMod.getBaseMod() - OrderMod.OrderList = make(map[int]order.Order) - for i := 0; i < 1000; i++ { - OrderMod.ChessPool = nil - OrderMod.EmitShuffle = nil + //OrderMod.OrderList = make(map[int]order.Order) + for i := 0; i < 5000; i++ { + //OrderMod.ChessPool = nil + //OrderMod.EmitShuffle = nil err := OrderMod.CreateNormalOrder(BaseMod.GetLevel(), ChessMod.GetOrderEmit(), BaseMod.GetEnergyMul()) if err != nil { return err } } p.FormatOrderReward() + NumMap := make(map[int]int) + for _, v := range OrderMod.OrderList { + NumMap[len(v.MergeId)]++ + } + sum0 := 0 + for _, v := range NumMap { + sum0 += v + } + for k, v := range NumMap { + fmt.Printf("棋子数量: %d, 占比: %.2f%% \n", k, float64(v)/float64(sum0)*100) + } + DiffMap := make(map[int]int) + for _, v := range OrderMod.OrderList { + DiffMap[v.Diff]++ + } + sum := 0 + for _, v := range DiffMap { + sum += v + } + for k, v := range DiffMap { + fmt.Printf("难度等级: %d, 占比: %.2f%% \n", k, float64(v)/float64(sum)*100) + } + AP := make(map[string]int, 0) + BP := make(map[string]int, 0) + for _, v := range OrderMod.OrderList { + for _, id := range v.MergeId { + Color := mergeDataCfg.GetColorById(id) + if Color == "Bath Toys" { + AP["Bath Toys"] += 1 + } + if Color == "Cleaning Tools" { + AP["Cleaning Tools"] += 1 + } + if Color == "Baby Toy" { + BP["Baby Toy"] += 1 + } + if Color == "Books And Picture Books" { + BP["Books And Picture Books"] += 1 + } + } + } + sum1 := 0 + for _, v := range AP { + sum1 += v + } + sum2 := 0 + for _, v := range BP { + sum2 += v + } + for k, v := range AP { + fmt.Printf("%s %.2f\n", k, float64(v)/float64(sum1)*100) + } + for k, v := range BP { + fmt.Printf("%s %.2f\n", k, float64(v)/float64(sum2)*100) + } return nil } diff --git a/src/server/game/mod/order/Order.go b/src/server/game/mod/order/Order.go index add9cf5d..8dbec507 100644 --- a/src/server/game/mod/order/Order.go +++ b/src/server/game/mod/order/Order.go @@ -2,7 +2,6 @@ package order import ( "fmt" - "log" "server/GoUtil" limitedTimeEventCfg "server/conf/limitedTimeEvent" mergeDataCfg "server/conf/mergeData" @@ -23,11 +22,14 @@ type OrderMod struct { EimtOrder map[string]struct{} PreheatStep map[string]int // 预热订单步骤 EmitShuffle []string // 发射器乱序 + ColorShuffle []string // 棋子系列乱序 + LastColor string // 上次生成订单的棋子系列 ChessPool []int // 棋子池 OrderPool map[int]*Order // 订单池 FinishOrder []int // 已完成订单 IsCharge bool // 是否充值 AutoEmit []string // 自动发射器 + LastChess int // 上次生成订单的棋子 } type Order struct { @@ -431,7 +433,18 @@ func (o *OrderMod) CreateNormalOrder(lv int, Emit []int, EnergyMul int) error { } break } - log.Printf("CreateNormalOrder: %v, %v, %v", mergeList, OrderDiff, err) + // if len(mergeList) == 2 { + // ColorMap := make(map[string]int) + // for _, v := range mergeList { + // Color := mergeDataCfg.GetColorById(v) + // ColorMap[Color]++ + // if ColorMap[Color] > 1 { + // log.Printf("CreateNormalOrder: %v, %v, %v", mergeList, OrderDiff, err) + // return fmt.Errorf("订单生成失败,重复颜色") + // } + // } + + // } o.addOrder(mergeList, OrderDiff, Common_type) return nil } @@ -671,7 +684,7 @@ func (o *OrderMod) Retire(EmitId string) { ChessPool = append(ChessPool, v) } o.ChessPool = ChessPool - o.EmitShuffle = nil + o.ColorShuffle = nil } func (o *OrderMod) DelOrder(OrderId int) (*Order, error) { @@ -710,8 +723,8 @@ func (o *OrderMod) CreateComfortOrder(lv int, Emit []int, EnergyMul, Diff, Chess } func (o *OrderMod) ResetChessPool() { - o.ChessPool = make([]int, 0) - o.EmitShuffle = nil + // o.ChessPool = make([]int, 0) + // o.EmitShuffle = nil } func (o *OrderMod) SetIsCharge() { diff --git a/src/server/game/mod/order/OrderFunc.go b/src/server/game/mod/order/OrderFunc.go index c1387ad8..f85e8fad 100644 --- a/src/server/game/mod/order/OrderFunc.go +++ b/src/server/game/mod/order/OrderFunc.go @@ -145,15 +145,46 @@ func getChessDiff(ChessNum, OrderDiff, OrderN int) map[int]int { func getChessLv(Min, Max, Diff int) int { Start := Min End := Max - switch Diff { - case DIFF_LOW: - End = Min + (Max-Min+1)/3 - 1 - case DIFF_MID: - Start = Min + (Max-Min+1)/3 - End = Min + (Max-Min+1)/3*2 - 1 - case DIFF_HIGH: - Start = Min + (Max-Min+1)/3*2 + if Max-Min >= 5 { + switch Diff { + case DIFF_LOW: + End = Min + (Max-Min+1)/3 - 1 + case DIFF_MID: + Start = Min + (Max-Min+1)/3 + End = Min + (Max-Min+1)/3*2 - 1 + case DIFF_HIGH: + Start = Min + (Max-Min+1)/3*2 + } } + if Max-Min == 2 { + Start = Max - Diff + 1 + End = Start + } + if Max-Min == 3 { + switch Diff { + case DIFF_LOW: + End = Min + 1 + case DIFF_MID: + Start = Min + 2 + End = Min + 2 + case DIFF_HIGH: + Start = Min + 3 + End = Min + 3 + } + } + if Max-Min == 4 { + switch Diff { + case DIFF_LOW: + End = Min + 1 + case DIFF_MID: + Start = Min + 2 + End = Min + 3 + case DIFF_HIGH: + Start = Min + 4 + End = Min + 4 + } + } + Start = max(Min, Start) End = max(Start, End) End = min(Max, End) @@ -386,10 +417,61 @@ func filterPool(o *OrderMod) { o.ChessPool = NewPool } +func ShuffleColor(List []string, Last string) []string { + Break := 0 + for { + Break++ + if Break > 1000 { + break + } + Same := false + NewList := GoUtil.ShuffleStringArray(List) + if NewList[0] == Last { + continue + } + for i := 1; i < len(NewList); i++ { + BeforeSries := mergeDataCfg.GetEmitTypeByColor(NewList[i-1]) + NowSries := mergeDataCfg.GetEmitTypeByColor(NewList[i]) + if BeforeSries == NowSries { + Same = true + break + } + + } + if !Same { + return NewList + } + } + L1 := make(map[string][]string, 0) + for _, v := range List { + Sries := mergeDataCfg.GetEmitTypeByColor(v) + L1[Sries] = append(L1[Sries], v) + } + List = make([]string, 0) + for _, v := range L1 { + + List = append(List, v[0]) + } + for _, v := range L1 { + if len(v) > 1 { + List = append(List, v[1]) + } + } + for _, v := range L1 { + if len(v) > 2 { + List = append(List, v[2]) + } + } + if List[0] == Last { + List[0], List[1] = List[1], List[0] + } + return List +} + // 获取发射器系列 func getEmitSeries(o *OrderMod, Emit []int) string { - if o.EmitShuffle == nil { - o.EmitShuffle = make([]string, 0) + if o.ColorShuffle == nil { + ColorShuffle := make([]string, 0) for _, v := range Emit { EmitId := mergeDataCfg.GetEmitId(v) if GoUtil.InStringArray(EmitId, o.AutoEmit) { @@ -399,47 +481,27 @@ func getEmitSeries(o *OrderMod, Emit []int) string { if len(EmitProduct) == 0 || EmitProduct[0] == "" { continue } - EmitSerie := mergeDataCfg.GetEmitId(v) - if GoUtil.InStringArray(EmitSerie, o.EmitShuffle) { + ColorShuffle = append(ColorShuffle, EmitProduct...) + } + o.ColorShuffle = ShuffleColor(ColorShuffle, o.LastColor) + } + PopEmitId, NewSlice := GoUtil.PopStringArray(o.ColorShuffle) + o.ColorShuffle = NewSlice + o.LastColor = PopEmitId + if len(o.ColorShuffle) == 0 { + ColorShuffle := make([]string, 0) + for _, v := range Emit { + EmitId := mergeDataCfg.GetEmitId(v) + if GoUtil.InStringArray(EmitId, o.AutoEmit) { continue } - for i := 0; i < len(EmitProduct); i++ { - o.EmitShuffle = append(o.EmitShuffle, EmitSerie) - } - } - o.EmitShuffle = GoUtil.ShuffleStringArray(o.EmitShuffle) - } - PopEmitId, NewSlice := GoUtil.PopStringArray(o.EmitShuffle) - o.EmitShuffle = NewSlice - if len(o.EmitShuffle) == 0 { - o.EmitShuffle = make([]string, 0) - for _, v := range Emit { EmitProduct := mergeDataCfg.GetEmitProduceType(v) if len(EmitProduct) == 0 || EmitProduct[0] == "" { continue } - EmitSerie := mergeDataCfg.GetEmitId(v) - if GoUtil.InStringArray(EmitSerie, o.EmitShuffle) { - continue - } - for i := 0; i < len(EmitProduct); i++ { - o.EmitShuffle = append(o.EmitShuffle, EmitSerie) - } - } - Num := 1 - for { - if len(o.EmitShuffle) == 1 { - break - } - o.EmitShuffle = GoUtil.ShuffleStringArray(o.EmitShuffle) - if o.EmitShuffle[0] != PopEmitId { - break - } - Num++ - if Num > 100 { - break - } + ColorShuffle = append(ColorShuffle, EmitProduct...) } + o.ColorShuffle = ShuffleColor(ColorShuffle, o.LastColor) } return PopEmitId } @@ -469,19 +531,20 @@ func GetChessByDiff(EmitId, EnergyMul, Diff int, Color string) []int { // 从棋子池中获取棋子 func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) int { - EmitSeries := getEmitSeries(o, Emit) - EmitChessId := getEmitBySeries(Emit, EmitSeries) - ColorRand := mergeDataCfg.GetEmitProduceType(EmitChessId) + Color := getEmitSeries(o, Emit) + EmitChessId := getEmitBySeries(Emit, Color) + //ColorRand := mergeDataCfg.GetEmitProduceType(EmitChessId) // 从棋子池中获取棋子 MinChessId := 0 for i, chess := range o.ChessPool { chessColor := mergeDataCfg.GetColorById(chess) + if Color != chessColor { + continue + } if reflectChess[chess] > Diff { MinChessId = chess } - if !GoUtil.InStringArray(chessColor, ColorRand) { - continue - } + ChessLv := mergeDataCfg.GetLvById(chess) if reflectChess[chess] == Diff && ChessLv >= EnergyMul+1 && ChessLv <= EnergyMul+12 { o.ChessPool = append(o.ChessPool[:i], o.ChessPool[i+1:]...) @@ -492,25 +555,22 @@ func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) in * 1. 选取最接近的棋子 */ if MinChessId != 0 { - MinChessColor := mergeDataCfg.GetColorById(MinChessId) - NewEmitChessId := GetEmitByColor(Emit, MinChessColor) - ColorRand := mergeDataCfg.GetEmitProduceType(NewEmitChessId) - ChessMinLv, ChessMaxLv := getChesslvRange(NewEmitChessId, EnergyMul, o.IsCharge) + ColorRand := mergeDataCfg.GetEmitProduceType(EmitChessId) + ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul, o.IsCharge) NewLev := getChessLv(ChessMinLv, ChessMaxLv, Diff) MinChessLv := mergeDataCfg.GetLvById(MinChessId) - NewLev2 := mergeDataCfg.DynamicLev2(NewLev, NewEmitChessId, ColorRand[0], MinChessColor) + NewLev2 := mergeDataCfg.DynamicLev2(NewLev, EmitChessId, ColorRand[0], Color) NewLev3 := adjustLev(NewLev2, EnergyMul) o.ChessPool = GoUtil.DeleteEleByValue(o.ChessPool, MinChessId) for i := NewLev3; i < MinChessLv; i++ { - ChessId2 := mergeDataCfg.GetChessIdByLvAndColor(i, MinChessColor) + ChessId2 := mergeDataCfg.GetChessIdByLvAndColor(i, Color) if ChessId2 != 0 { o.ChessPool = append(o.ChessPool, ChessId2) } } - Chess := mergeDataCfg.GetChessIdByLvAndColor(NewLev2, MinChessColor) + Chess := mergeDataCfg.GetChessIdByLvAndColor(NewLev2, Color) return Chess } - Color := GoUtil.RandStringSlice(ColorRand) ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul, o.IsCharge) NewLev := getChessLv(ChessMinLv, ChessMaxLv, Diff) NewLev1 := mergeDataCfg.DynamicLev(NewLev, EmitChessId, Color) @@ -593,7 +653,7 @@ func getEmitBySeries(EmitList []int, EmitId string) int { if len(ProduceColor) == 0 || ProduceColor[0] == "" { continue } - if mergeDataCfg.GetEmitId(v) == EmitId { + if GoUtil.InStringArray(EmitId, ProduceColor) { return v } }