diff --git a/src/server/GoUtil/sliceUtil.go b/src/server/GoUtil/sliceUtil.go index 172e1685..9e0239ca 100644 --- a/src/server/GoUtil/sliceUtil.go +++ b/src/server/GoUtil/sliceUtil.go @@ -234,3 +234,28 @@ func IntSliceToString(slice []int) string { str = strings.Trim(str, "[]") return str } + +func PopStringArray(s []string) (string, []string) { + if len(s) == 0 { + return "", s + } + return s[0], s[1:] +} + +func ShuffleStringArray(s []string) []string { + r := make([]string, len(s)) + perm := GetRand().Perm(len(s)) + for i, v := range perm { + r[v] = s[i] + } + return r +} + +func ShuffleArray(s []int) []int { + r := make([]int, len(s)) + perm := GetRand().Perm(len(s)) + for i, v := range perm { + r[v] = s[i] + } + return r +} diff --git a/src/server/conf/mergeData/MergeDataCfg.go b/src/server/conf/mergeData/MergeDataCfg.go index 6219259b..0ab2cf4e 100644 --- a/src/server/conf/mergeData/MergeDataCfg.go +++ b/src/server/conf/mergeData/MergeDataCfg.go @@ -56,6 +56,15 @@ func GetEmitProduce(EmitType string) []string { return strings.Split(gamedata.GetStringValue(data, "Product_Type"), ",") } +func GetEmitOrderProduce(EmitType string) []string { + data, err := gamedata.GetDataByKey(CFG_MERGE_EMIT, EmitType) + if err != nil { + log.Debug("GetEmitProduce GetOne EmitType:%s not found", EmitType) + return []string{} + } + return strings.Split(gamedata.GetStringValue(data, "Order_Type"), ",") +} + // 获取单个数据 func GetOne(Id int) (*gamedata.MergeDataRecord, error) { data, err := gamedata.GetDataByIntKey(CFG_NAME, Id) @@ -317,3 +326,85 @@ func GetHighSourceChestItem() []*item.Item { r = append(r, item.NewItem(item.ITEM_ENERGY_ID, B4)) return r } + +func DynamicLev(Lv int, EmitId int, Color string) int { + data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId) + if err != nil { + log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId) + return Lv + } + DynamicLv := gamedata.GetStringValue(data, "Dynamic") + if DynamicLv == "" { + return Lv + } + Arr := strings.Split(DynamicLv, ",") + for _, v := range Arr { + Arr2 := strings.Split(v, "=") + if len(Arr2) != 2 { + continue + } + if Color == Arr2[0] { + NewLv, _ := strconv.Atoi(Arr2[1]) + return Lv - NewLv + } + } + return Lv +} +func DynamicLev2(Lv int, EmitId int, Color1 string, Color2 string) int { + data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId) + if err != nil { + log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId) + return Lv + } + DynamicLv := gamedata.GetStringValue(data, "Dynamic") + if DynamicLv == "" { + return Lv + } + Arr := strings.Split(DynamicLv, ",") + BaseLv := Lv + for _, v := range Arr { + Arr2 := strings.Split(v, "=") + if len(Arr2) != 2 { + continue + } + if Color1 == Arr2[0] { + NewLv, _ := strconv.Atoi(Arr2[1]) + BaseLv = Lv + NewLv + } + } + for _, v := range Arr { + Arr2 := strings.Split(v, "=") + if len(Arr2) != 2 { + continue + } + if Color2 == Arr2[0] { + NewLv, _ := strconv.Atoi(Arr2[1]) + return BaseLv - NewLv + } + } + return Lv +} + +func DynamicAdjust(EmitId int, Color string) int { + data, err := gamedata.GetDataByIntKey(CFG_NAME, EmitId) + if err != nil { + log.Debug("DynamicLev GetOne EmitId:%v not found", EmitId) + return 0 + } + DynamicLv := gamedata.GetStringValue(data, "Dynamic") + if DynamicLv == "" { + return 0 + } + Arr := strings.Split(DynamicLv, ",") + for _, v := range Arr { + Arr2 := strings.Split(v, "=") + if len(Arr2) != 2 { + continue + } + if Color == Arr2[0] { + NewLv, _ := strconv.Atoi(Arr2[1]) + return NewLv + } + } + return 0 +} diff --git a/src/server/game/UnitTest.go b/src/server/game/UnitTest.go index 671c9ddf..1a6376fd 100644 --- a/src/server/game/UnitTest.go +++ b/src/server/game/UnitTest.go @@ -55,7 +55,7 @@ func UnitOrder(p *Player) error { OrderMod := p.PlayMod.getOrderMod() ChessMod := p.PlayMod.getChessMod() OrderMod.OrderList = make(map[int]order.Order) - for i := 0; i < 150; i++ { + for i := 0; i < 10000; i++ { err := OrderMod.CreateNormalOrder(7, ChessMod.GetEmitList(), 3) if err != nil { return err diff --git a/src/server/game/mod/order/Order.go b/src/server/game/mod/order/Order.go index 02087d29..7c840953 100644 --- a/src/server/game/mod/order/Order.go +++ b/src/server/game/mod/order/Order.go @@ -9,6 +9,7 @@ import ( playroomCfg "server/conf/playroom" "server/game/mod/item" "server/msg" + "server/pkg/github.com/name5566/leaf/log" "sort" "time" ) @@ -22,6 +23,8 @@ type OrderMod struct { LastNormalOrder Order // 上一个普通订单 EimtOrder map[string]struct{} PreheatStep map[string]int // 预热订单步骤 + EmitShuffle []string // 发射器乱序 + ChessPool []int // 棋子池 } type Order struct { @@ -235,7 +238,7 @@ func (o *OrderMod) CreateNormalOrder(lv int, Emit []int, EnergyMul int) error { } break } - + log.Debug("CreateNormalOrder mergeList:%v, OrderDiff:%v", mergeList, OrderDiff) o.addOrder(mergeList, OrderDiff, Common_type) return nil } diff --git a/src/server/game/mod/order/OrderFunc.go b/src/server/game/mod/order/OrderFunc.go index ac333dc8..87b44a41 100644 --- a/src/server/game/mod/order/OrderFunc.go +++ b/src/server/game/mod/order/OrderFunc.go @@ -7,6 +7,8 @@ import ( userCfg "server/conf/user" ) +var reflectChess = map[int]int{} + func getChessNumRand(OrderN int) map[int]int { return map[int]int{ 1: int(25 - 4*OrderN), @@ -137,34 +139,34 @@ func getChessLv(Min, Max, Diff int) int { return GoUtil.RandNum(Start, End) } -func getRandChessColorList(o *OrderMod, Emit []int, EnergyMul int) map[string]int { - r := make(map[string]int) - ChessList := make([]int, 0) - for _, v := range o.OrderList { - if v.Type == Common_type { - ChessList = append(ChessList, v.MergeId...) - } - } - for _, v := range Emit { - Produce := mergeDataCfg.GetEmitProduceType(v) - if len(Produce) == 0 { - continue - } - if len(Produce) == 1 { - if Produce[0] == "" { - continue - } - r[Produce[0]] = 100 - continue - } - r[Produce[0]] = 80 - r[Produce[1]] = 20 - if checkA1High(ChessList, v, EnergyMul) { - r[Produce[1]] += 20 - } - } - return r -} +// func getRandChessColorList(o *OrderMod, Emit []int, EnergyMul int) map[string]int { +// r := make(map[string]int) +// ChessList := make([]int, 0) +// for _, v := range o.OrderList { +// if v.Type == Common_type { +// ChessList = append(ChessList, v.MergeId...) +// } +// } +// for _, v := range Emit { +// Produce := mergeDataCfg.GetEmitProduceType(v) +// if len(Produce) == 0 { +// continue +// } +// if len(Produce) == 1 { +// if Produce[0] == "" { +// continue +// } +// r[Produce[0]] = 100 +// continue +// } +// r[Produce[0]] = 80 +// r[Produce[1]] = 20 +// if checkA1High(ChessList, v, EnergyMul) { +// r[Produce[1]] += 20 +// } +// } +// return r +// } func RandChessColor(Emit []int) string { r := make(map[string]int) @@ -186,21 +188,21 @@ func RandChessColor(Emit []int) string { return GoUtil.RandStringMap(r) } -func checkA1High(ChessList []int, Emit int, EnergyMul int) bool { - ChessMinLev, ChessMaxLev := getChesslvRange(Emit, EnergyMul) - HighLv := ChessMinLev + ((ChessMaxLev-ChessMinLev)/3)*2 - Produce := mergeDataCfg.GetEmitProduceChessType(Emit) - for _, v := range ChessList { - ChessColor := mergeDataCfg.GetColorById(v) - if ChessColor == Produce[0] { - ChessLv := mergeDataCfg.GetLvById(v) - if ChessLv >= HighLv { - return true - } - } - } - return false -} +// func checkA1High(ChessList []int, Emit int, EnergyMul int) bool { +// ChessMinLev, ChessMaxLev := getChesslvRange(Emit, EnergyMul) +// HighLv := ChessMinLev + ((ChessMaxLev-ChessMinLev)/3)*2 +// Produce := mergeDataCfg.GetEmitProduceChessType(Emit) +// for _, v := range ChessList { +// ChessColor := mergeDataCfg.GetColorById(v) +// if ChessColor == Produce[0] { +// ChessLv := mergeDataCfg.GetLvById(v) +// if ChessLv >= HighLv { +// return true +// } +// } +// } +// return false +// } func getChesslvRange(Emit int, EnergyMul int) (int, int) { RandEmitLv := mergeDataCfg.GetLvById(Emit) @@ -226,40 +228,92 @@ func getEmitByColor(Emit []int, color string) int { return 0 } +// 生成订单 func randOrderChess(o *OrderMod, lv int, Emit []int, EnergyMul int) ([]int, int, error) { + initReflectChess(Emit, EnergyMul) OrderN, err := userCfg.GetOrderNByLv(lv) RandChessNum := getChessNumRand(OrderN) if err != nil { return nil, diff_low, err } + // 生成订单难度和棋子数量 ChessNum := GoUtil.RandMap(RandChessNum) OrderDiffRand := getOrderDiffRand(o.LastDiff, OrderN) OrderDiff := GoUtil.RandMap(OrderDiffRand) ChessDiff := getChessDiff(ChessNum, OrderDiff, OrderN) mergeList := make([]int, 0, len(ChessDiff)) - ColorRand := getRandChessColorList(o, Emit, EnergyMul) - var Color string + // 根据订单棋子难度生成棋子 for _, v := range ChessDiff { - Color = GoUtil.RandStringMap(ColorRand) - delete(ColorRand, Color) - Emit := getEmitByColor(Emit, Color) - ChessMinLv, ChessMaxLv := getChesslvRange(Emit, EnergyMul) - NewLev := getChessLv(ChessMinLv, ChessMaxLv, v) - ColorMaxLv := mergeDataCfg.GetMaxLvByColor(Color) - NewLev = min(NewLev, ColorMaxLv) - ChessId := mergeDataCfg.GetChessIdByLvAndColor(NewLev, Color) - Type := mergeDataCfg.GetTypeById(ChessId) - if Type != "Product" { - continue - } - if ChessId == 0 { - continue + // EmitId := getEmitId(o, Emit) + // ColorRand := mergeDataCfg.GetEmitOrderProduce(EmitId) + // Color := GoUtil.RandStringSlice(ColorRand) + // EmitChessId := getEmitByColor(Emit, Color) + // ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul) + // NewLev := getChessLv(ChessMinLv, ChessMaxLv, v) + // ColorMaxLv := mergeDataCfg.GetMaxLvByColor(Color) + // NewLev = min(NewLev, ColorMaxLv) + // ChessId := mergeDataCfg.GetChessIdByLvAndColor(NewLev, Color) + // Type := mergeDataCfg.GetTypeById(ChessId) + // if Type != "Product" { + // continue + // } + // if ChessId == 0 { + // continue + // } + ChessId := 0 + for { + ChessId = getChessFromPoolByDiff(o, v, Emit, EnergyMul) + if !GoUtil.InArray(ChessId, mergeList) { + break + } } mergeList = append(mergeList, ChessId) } return mergeList, OrderDiff, nil } +func getEmitId(o *OrderMod, Emit []int) string { + if o.EmitShuffle == nil { + o.EmitShuffle = make([]string, 0) + for _, v := range Emit { + EmitProduct := mergeDataCfg.GetEmitProduceType(v) + if len(EmitProduct) == 0 || EmitProduct[0] == "" { + continue + } + EmitId := mergeDataCfg.GetEmitId(v) + if GoUtil.InStringArray(EmitId, o.EmitShuffle) { + continue + } + o.EmitShuffle = append(o.EmitShuffle, EmitId) + } + 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 { + EmitId := mergeDataCfg.GetEmitId(v) + if GoUtil.InStringArray(EmitId, o.EmitShuffle) { + continue + } + o.EmitShuffle = append(o.EmitShuffle, EmitId) + } + Num := 1 + for { + GoUtil.ShuffleStringArray(o.EmitShuffle) + if o.EmitShuffle[0] != PopEmitId { + break + } + Num++ + if Num > 100 { + break + } + } + } + return PopEmitId +} + func getOrderStar(ChessList []int) int { Star := 0 for _, v := range ChessList { @@ -267,3 +321,105 @@ func getOrderStar(ChessList []int) int { } return Star } + +func getChessFromPoolByDiff(o *OrderMod, Diff int, Emit []int, EnergyMul int) int { + EmitId := getEmitId(o, Emit) + ColorRand := mergeDataCfg.GetEmitOrderProduce(EmitId) + Color := GoUtil.RandStringSlice(ColorRand) + EmitChessId := getEmitByColor(Emit, Color) + // 从棋子池中获取棋子 + MinChessId := 0 + for i, chess := range o.ChessPool { + chessColor := mergeDataCfg.GetColorById(chess) + if reflectChess[chess] > Diff { + MinChessId = chess + } + if !GoUtil.InStringArray(chessColor, ColorRand) { + continue + } + if reflectChess[chess] == Diff { + // ChessLev := mergeDataCfg.GetLvById(chess) + o.ChessPool = append(o.ChessPool[:i], o.ChessPool[i+1:]...) + // for _, i := range ColorRand { + // if i == Color { + // continue + // } + // NewLev2 := mergeDataCfg.DynamicLev2(ChessLev, EmitChessId, Color, i) + // ChessId2 := mergeDataCfg.GetChessIdByLvAndColor(NewLev2, i) + // if ChessId2 != 0 { + // o.ChessPool = append(o.ChessPool, ChessId2) + // } + // } + return chess + } + } + + // 获取不到时选最接近的棋子 + ChessMinLv, ChessMaxLv := getChesslvRange(EmitChessId, EnergyMul) + NewLev := getChessLv(ChessMinLv, ChessMaxLv, Diff) + NewLev1 := mergeDataCfg.DynamicLev(NewLev, EmitChessId, Color) + if MinChessId != 0 { + MinChessColor := mergeDataCfg.GetColorById(MinChessId) + MinChessLv := mergeDataCfg.GetLvById(MinChessId) + NewEmitChessId := getEmitByColor(Emit, MinChessColor) + NewChessLv := mergeDataCfg.DynamicLev(NewLev, NewEmitChessId, MinChessColor) + o.ChessPool = GoUtil.DeleteEleByValue(o.ChessPool, MinChessId) + for i := NewChessLv; i < MinChessLv; i++ { + ChessId2 := mergeDataCfg.GetChessIdByLvAndColor(i, MinChessColor) + if ChessId2 != 0 { + o.ChessPool = append(o.ChessPool, ChessId2) + } + } + return mergeDataCfg.GetChessIdByLvAndColor(NewLev1, MinChessColor) + } + ChessId := mergeDataCfg.GetChessIdByLvAndColor(NewLev1, Color) + for _, i := range ColorRand { + if i == Color { + continue + } + NewLev2 := mergeDataCfg.DynamicLev2(NewLev1, EmitChessId, Color, i) + ChessId2 := mergeDataCfg.GetChessIdByLvAndColor(NewLev2, i) + if ChessId2 != 0 { + o.ChessPool = append(o.ChessPool, ChessId2) + } + } + o.ChessPool = GoUtil.ShuffleArray(o.ChessPool) + if len(o.ChessPool) > 200 { + o.ChessPool = o.ChessPool[:200] + } + return ChessId +} + +func initReflectChess(Emits []int, EnergyMul int) { + Start, End := 0, 0 + for _, Emit := range Emits { + ChessMinLv, ChessMaxLv := getChesslvRange(Emit, EnergyMul) + Product := mergeDataCfg.GetEmitProduceChessType(Emit) + Start = ChessMinLv + End = ChessMinLv + (ChessMaxLv-ChessMinLv+1)/3 - 1 + for _, v := range Product { + Adjust := mergeDataCfg.DynamicAdjust(Emit, v) + 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) + } + 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) + } + } +} + +func initReflectChess2(Color string, Start, End, Diff, adjust int) { + for i := Start; i <= End; i++ { + Lv := max(i-adjust, 1) + ChessId := mergeDataCfg.GetChessIdByLvAndColor(Lv, Color) + reflectChess[ChessId] = Diff + } +}