修改订单逻辑

This commit is contained in:
hahwu 2025-01-14 17:59:42 +08:00
parent e3fe8db5f4
commit affc20bf9f
5 changed files with 336 additions and 61 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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

View File

@ -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
}

View File

@ -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
}
}