diff --git a/src/server/game/mod/order/Order.go b/src/server/game/mod/order/Order.go index fdb6e8fa..26a49442 100644 --- a/src/server/game/mod/order/Order.go +++ b/src/server/game/mod/order/Order.go @@ -20,17 +20,18 @@ type OrderMod struct { LastOrder Order // 上一个订单 LastNormalOrder Order // 上一个普通订单 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 // 上次生成订单的棋子 - NextDiff int // 下次订单难度 + PreheatStep map[string]int // 预热订单步骤 + EmitShuffle []string // 发射器乱序 + ColorShuffle []string // 棋子系列乱序 + LastColor string // 上次生成订单的棋子系列 + ChessPool []int // 棋子池 + ChessPool2 map[string][]int // 按系列分类的棋子池 + OrderPool map[int]*Order // 订单池 + FinishOrder []int // 已完成订单 + IsCharge bool // 是否充值 + AutoEmit []string // 自动发射器 + LastChess int // 上次生成订单的棋子 + NextDiff int // 下次订单难度 ComfortEndTime int } @@ -94,6 +95,9 @@ func (o *OrderMod) InitData() { delete(o.OrderList, k) } } + if o.ChessPool2 == nil { + o.ChessPool2 = make(map[string][]int) + } if o.Auto_id == 0 { o.Auto_id = 10000 } diff --git a/src/server/game/mod/order/OrderFunc.go b/src/server/game/mod/order/OrderFunc.go index 0a5d04cd..11d3262f 100644 --- a/src/server/game/mod/order/OrderFunc.go +++ b/src/server/game/mod/order/OrderFunc.go @@ -1,12 +1,12 @@ package order import ( - "log" "math" "server/GoUtil" mergeDataCfg "server/conf/mergeData" orderCfg "server/conf/order" userCfg "server/conf/user" + "sort" ) var reflectChess = map[int]int{} // 棋子难度映射表 @@ -16,63 +16,63 @@ var orderCfgMap = map[int]orderConfig{ Min: 15, Max: 150, Pool: map[int]orderConfigInfo{ - 1: {lv: 5, energy: 16, t: 1}, - 2: {lv: 6, energy: 32, t: 1}, - 3: {lv: 7, energy: 64, t: 1}, - 4: {lv: 8, energy: 128, t: 1}, + 1: {lv: 5, energy: 16, t: 0}, + 2: {lv: 6, energy: 32, t: 0}, + 3: {lv: 7, energy: 64, t: 0}, + 4: {lv: 8, energy: 128, t: 0}, }, }, 2: { Min: 20, Max: 300, Pool: map[int]orderConfigInfo{ - 2: {lv: 6, energy: 32, t: 1}, - 3: {lv: 7, energy: 64, t: 1}, - 4: {lv: 8, energy: 128, t: 1}, + 2: {lv: 6, energy: 32, t: 0}, + 3: {lv: 7, energy: 64, t: 0}, + 4: {lv: 8, energy: 128, t: 0}, }, }, 3: { Min: 40, Max: 400, Pool: map[int]orderConfigInfo{ - 1: {lv: 5, energy: 16, t: 1}, - 2: {lv: 6, energy: 32, t: 1}, - 3: {lv: 7, energy: 64, t: 1}, - 4: {lv: 8, energy: 128, t: 1}, - 5: {lv: 9, energy: 256, t: 1}, + 1: {lv: 5, energy: 16, t: 0}, + 2: {lv: 6, energy: 32, t: 0}, + 3: {lv: 7, energy: 64, t: 0}, + 4: {lv: 8, energy: 128, t: 0}, + 5: {lv: 9, energy: 256, t: 0}, }, }, 4: { Min: 40, Max: 200, Pool: map[int]orderConfigInfo{ - 1: {lv: 5, energy: 16, t: 0}, - 2: {lv: 6, energy: 32, t: 0}, - 3: {lv: 7, energy: 64, t: 1}, - 4: {lv: 8, energy: 128, t: 1}, + 1: {lv: 5, energy: 16, t: 1}, + 2: {lv: 6, energy: 32, t: 1}, + 3: {lv: 7, energy: 64, t: 0}, + 4: {lv: 8, energy: 128, t: 0}, }, }, 5: { Min: 100, Max: 600, Pool: map[int]orderConfigInfo{ - 1: {lv: 6, energy: 32, t: 0}, - 2: {lv: 7, energy: 64, t: 0}, - 3: {lv: 8, energy: 128, t: 1}, - 4: {lv: 9, energy: 256, t: 1}, - 5: {lv: 10, energy: 512, t: 1}, + 1: {lv: 6, energy: 32, t: 1}, + 2: {lv: 7, energy: 64, t: 1}, + 3: {lv: 8, energy: 128, t: 0}, + 4: {lv: 9, energy: 256, t: 0}, + 5: {lv: 10, energy: 512, t: 0}, }, }, 6: { Min: 500, Max: 1200, Pool: map[int]orderConfigInfo{ - 1: {lv: 6, energy: 32, t: 0}, - 2: {lv: 7, energy: 64, t: 0}, - 3: {lv: 8, energy: 128, t: 1}, - 4: {lv: 9, energy: 256, t: 1}, - 5: {lv: 10, energy: 512, t: 1}, - 6: {lv: 11, energy: 1024, t: 1}, + 1: {lv: 6, energy: 32, t: 1}, + 2: {lv: 7, energy: 64, t: 1}, + 3: {lv: 8, energy: 128, t: 0}, + 4: {lv: 9, energy: 256, t: 0}, + 5: {lv: 10, energy: 512, t: 0}, + 6: {lv: 11, energy: 1024, t: 0}, }, }, } @@ -686,25 +686,28 @@ func GetChessByDiff(EmitId, EnergyMul, Diff int, Color string) []int { } return GoUtil.UniqueInts(ChessIds) } -func getChessLvFromConfig1(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) (int, bool) { +func (o *OrderMod) getChessLvFromConfig1(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) []int { rand := []int{} + t := 0 + if LastEnergy > 0 { + t = 1 + } for _, v := range orderCfgMap { if MinEnergy >= v.Min && MaxEnergy <= v.Max { for _, info := range v.Pool { - if MinLv <= info.lv && MaxLv >= info.lv && LastEnergy+info.energy <= MaxEnergy && LastEnergy+info.energy >= MinEnergy && info.t == 1 { + if MinLv <= info.lv && MaxLv >= info.lv && LastEnergy+info.energy <= MaxEnergy && LastEnergy+info.energy >= MinEnergy && t >= info.t { rand = append(rand, info.lv) } } - if len(rand) > 0 { - return GoUtil.RandSlice(rand), true - } - return 6, false } } - return 6, false + if len(rand) == 0 { + return rand + } + return rand } -func getChessLvFromConfig2(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) (int, bool) { +func (o *OrderMod) getChessLvFromConfig2(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) []int { rand := []int{} for _, v := range orderCfgMap { if MinEnergy >= v.Min && MaxEnergy <= v.Max { @@ -713,15 +716,12 @@ func getChessLvFromConfig2(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) ( rand = append(rand, info.lv) } } - if len(rand) > 0 { - return GoUtil.RandSlice(rand), true - } - return 0, false + } } - return 0, false + return rand } -func getChessLvFromConfig3(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) (int, bool) { +func (o *OrderMod) getChessLvFromConfig3(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) []int { rand := []int{} for _, v := range orderCfgMap { if MinEnergy >= v.Min && MaxEnergy <= v.Max { @@ -730,65 +730,110 @@ func getChessLvFromConfig3(MinEnergy, MaxEnergy, MinLv, MaxLv, LastEnergy int) ( rand = append(rand, info.lv) } } - if len(rand) > 0 { - return GoUtil.RandSlice(rand), true - } - return 0, false + } } - return 0, false + return rand +} + +func (o *OrderMod) ChessPoolChess(Color string, Lv int) bool { + for _, v := range o.ChessPool2[Color] { + if v > Lv { + return true + } + } + return false +} + +func (o *OrderMod) getFromPool(Emit int, Color string, Lv int) { + for i, v := range o.ChessPool2[Color] { + if v == Lv { + o.ChessPool2[Color] = append(o.ChessPool2[Color][:i], o.ChessPool2[Color][i+1:]...) + return + } + } + for i, v := range o.ChessPool { + if v > Lv { + o.ChessPool2[Color] = append(o.ChessPool2[Color][:i], o.ChessPool2[Color][i+1:]...) + for k := Lv; k < v; k++ { + o.ChessPool2[Color] = append(o.ChessPool2[Color], k) + } + return + } + } + Product := mergeDataCfg.GetEmitProduceType(Emit) + if len(Product) < 2 { + return + } + for _, v := range Product { + if Color == v { + continue + } + o.ChessPool2[Color] = append(o.ChessPool2[Color], Lv) + } +} + +func (o *OrderMod) getChessIdPool(Emit []int, Color string, EnergyMul, Lv, MinEnergy, MaxEnergy, OrderDiff, LastEnergy int) (int, int) { + ChessLv := 0 + EmitChessId := getEmitBySeries(Emit, Color) + ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul, o.IsCharge) + ChessLvRand := o.getChessLvFromConfig1(MinEnergy, MaxEnergy, ChessMinLv, ChessMaxLv, LastEnergy) + Pool := o.ChessPool2[Color] + ChessLvRand2 := make([]int, 0) + for _, v := range ChessLvRand { + if GoUtil.InArray(v, Pool) { + ChessLvRand2 = append(ChessLvRand2, v) + } + } + if len(ChessLvRand2) > 0 { + ChessLv = GoUtil.RandSlice(ChessLvRand2) + } + sort.Ints(ChessLvRand) + if len(ChessLvRand) > 0 && len(ChessLvRand2) == 0 && o.ChessPoolChess(Color, ChessLvRand[len(ChessLvRand)-1]) { + ChessLv = ChessLvRand[len(ChessLvRand)-1] + } + if len(ChessLvRand) > 0 && len(ChessLvRand2) == 0 && !o.ChessPoolChess(Color, ChessLvRand[len(ChessLvRand)-1]) && len(ChessLvRand) > 0 { + ChessLv = GoUtil.RandSlice(ChessLvRand) + } + if ChessLv == 0 { + ChessLv = 6 + o.NextDiff = OrderDiff + } + o.getFromPool(EmitChessId, Color, ChessLv) + NewLev := mergeDataCfg.DynamicLev(ChessLv, EmitChessId, Color) + MaxLev := mergeDataCfg.GetMaxLvByColor(Color) + NewLev1 := adjustLev(NewLev, EnergyMul) + NewLev2 := min(NewLev1, MaxLev) + Chess := mergeDataCfg.GetChessIdByLvAndColor(NewLev2, Color) + if Chess == 0 { + Chess = mergeDataCfg.GetChessIdByLvAndColor(6, Color) + } + return Chess, ChessLv } func getChessFromPoolByEnergy(o *OrderMod, MinEnergy, MaxEnergy, ChessNum int, Emit []int, EnergyMul, OrderDiff int) []int { ColorArr := make([]string, 0) for i := 0; i < ChessNum; i++ { ColorArr = append(ColorArr, getEmitSeries(o, Emit)) } - Break := 0 - for { - LastEnergy := 0 - ChessArr := make([]int, 0) - for k, Color := range ColorArr { - EmitChessId := getEmitBySeries(Emit, Color) - ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul, o.IsCharge) - ChessLv := 0 - ok := false - if len(ColorArr) == 1 { - ChessLv, ok = getChessLvFromConfig1(MinEnergy, MaxEnergy, ChessMinLv, ChessMaxLv, LastEnergy) - } else { - if k == 0 { - ChessLv, ok = getChessLvFromConfig2(MinEnergy, MaxEnergy, ChessMinLv, ChessMaxLv, LastEnergy) - } else { - ChessLv, ok = getChessLvFromConfig3(MinEnergy, MaxEnergy, ChessMinLv, ChessMaxLv, LastEnergy) - } - } - LastEnergy += int(math.Pow(2, float64(ChessLv-1))) - if !ok && k == 0 && len(ColorArr) == 1 { - o.NextDiff = OrderDiff - } - NewLev := mergeDataCfg.DynamicLev(ChessLv, EmitChessId, Color) - MaxLev := mergeDataCfg.GetMaxLvByColor(Color) - NewLev1 := adjustLev(NewLev, EnergyMul) - NewLev2 := min(NewLev1, MaxLev) - Chess := mergeDataCfg.GetChessIdByLvAndColor(NewLev2, Color) - if Chess == 0 { - break - } - ChessArr = append(ChessArr, Chess) - } - if GoUtil.InArray(0, ChessArr) { - continue - } - if Break++; Break > 1000 { - return ChessArr - } - if LastEnergy < MinEnergy || LastEnergy > MaxEnergy { - continue - } - if len(ChessArr) > 0 { - log.Printf("订单棋子能量:%d,范围:%d-%d,棋子:%v", LastEnergy, MinEnergy, MaxEnergy, ChessArr) - return ChessArr + ChessArr := make([]int, 0) + if len(ColorArr) == 1 { + Chess, _ := o.getChessIdPool(Emit, ColorArr[0], EnergyMul, 0, MinEnergy, MaxEnergy, OrderDiff, 0) + if Chess == 0 { + Chess = mergeDataCfg.GetChessIdByLvAndColor(6, ColorArr[0]) } + return []int{Chess} } + if len(ColorArr) == 2 { + Chess1, Chess1Lv := o.getChessIdPool(Emit, ColorArr[0], EnergyMul, 0, MinEnergy, MaxEnergy, OrderDiff, 0) + if Chess1 == 0 { + Chess1 = mergeDataCfg.GetChessIdByLvAndColor(6, ColorArr[0]) + } + Energy := int(math.Pow(2, float64(Chess1Lv-1))) + Chess2, _ := o.getChessIdPool(Emit, ColorArr[1], EnergyMul, 0, MinEnergy, MaxEnergy, OrderDiff, Energy) + return []int{Chess1, Chess2} + } + + return ChessArr } // 从棋子池中获取棋子