修改订单逻辑
This commit is contained in:
parent
e3fe8db5f4
commit
affc20bf9f
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
// 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
|
||||
}
|
||||
if ChessId == 0 {
|
||||
continue
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user