go_dreamfactory/modules/battle/fight/utils.go
2022-09-13 20:13:06 +08:00

83 lines
2.1 KiB
Go

package fight
import (
"go_dreamfactory/modules/battle/fight/core"
"math/rand"
"sort"
)
type FightRoleSlice []core.IFightRole
func (x FightRoleSlice) Len() int { return len(x) }
func (x FightRoleSlice) Less(i, j int) bool {
return x[i].GetData().Operate.Value() < x[j].GetData().Operate.Value()
}
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
}