diff --git a/modules/battle/fight/utils.go b/modules/battle/fight/utils.go index 2ba2cbc64..8a7f2fc12 100644 --- a/modules/battle/fight/utils.go +++ b/modules/battle/fight/utils.go @@ -2,6 +2,7 @@ package fight import ( "go_dreamfactory/modules/battle/fight/core" + "math/rand" "sort" ) @@ -16,3 +17,66 @@ func (x FightRoleSlice) Swap(i, j int) { x[i], x[j] = x[j], x[i] } func (x FightRoleSlice) Sort(pType string) { sort.Sort(x) } + +func FightRoleSort(arr []core.IFightRole, pType string, pOrder core.EOrderType) []core.IFightRole { + if len(arr) <= 1 { + return arr + } + pivot := arr[rand.Intn(len(arr))] + lowPart := make([]core.IFightRole, 0, len(arr)) + highPart := make([]core.IFightRole, 0, len(arr)) + middlePart := make([]core.IFightRole, 0, len(arr)) + for _, v := range arr { + switch pType { + case "OperateValue": + switch { + case v.GetData().Operate.Value() < pivot.GetData().Operate.Value(): + if pOrder == core.EOrderType_Asc { + lowPart = append(lowPart, v) + } else { + highPart = append(highPart, v) + } + break + case v.GetData().Operate.Value() == pivot.GetData().Operate.Value(): + middlePart = append(middlePart, v) + break + case v.GetData().Operate.Value() > pivot.GetData().Operate.Value(): + if pOrder == core.EOrderType_Asc { + highPart = append(highPart, v) + } else { + lowPart = append(lowPart, v) + } + break + } + break + case "Speed": + switch { + case v.GetData().Speed.Value() < pivot.GetData().Speed.Value(): + if pOrder == core.EOrderType_Asc { + lowPart = append(lowPart, v) + } else { + highPart = append(highPart, v) + } + break + case v.GetData().Speed.Value() == pivot.GetData().Speed.Value(): + middlePart = append(middlePart, v) + break + case v.GetData().Speed.Value() > pivot.GetData().Speed.Value(): + if pOrder == core.EOrderType_Asc { + highPart = append(highPart, v) + } else { + lowPart = append(lowPart, v) + } + break + } + break + } + } + lowPart = FightRoleSort(lowPart, pType) + highPart = FightRoleSort(highPart, pType) + + lowPart = append(lowPart, middlePart...) + lowPart = append(lowPart, highPart...) + return lowPart + +}