2026-01-21 20:46:05 +00:00
|
|
|
|
package input
|
|
|
|
|
|
|
2026-02-20 09:40:22 +08:00
|
|
|
|
import (
|
|
|
|
|
|
"blazing/logic/service/fight/info"
|
|
|
|
|
|
"math/rand"
|
|
|
|
|
|
"time"
|
|
|
|
|
|
)
|
2026-01-22 14:29:08 +08:00
|
|
|
|
|
2026-02-20 09:40:22 +08:00
|
|
|
|
// Shuffle 打乱切片顺序,使用 Fisher-Yates 洗牌算法,泛型支持任意类型
|
|
|
|
|
|
func Shuffle[T any](slice []T) {
|
|
|
|
|
|
// 初始化随机数生成器,用当前时间作为种子,避免每次打乱结果相同
|
|
|
|
|
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
|
|
|
|
|
|
|
|
|
|
// 从后往前遍历,逐个交换
|
|
|
|
|
|
for i := len(slice) - 1; i > 0; i-- {
|
|
|
|
|
|
// 生成 0 到 i 之间的随机索引
|
|
|
|
|
|
j := r.Intn(i + 1)
|
|
|
|
|
|
// 交换 i 和 j 位置的元素
|
|
|
|
|
|
slice[i], slice[j] = slice[j], slice[i]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-21 20:46:05 +00:00
|
|
|
|
func (our *Input) GetAction() {
|
|
|
|
|
|
|
|
|
|
|
|
next := our.Exec(func(t Effect) bool {
|
|
|
|
|
|
|
|
|
|
|
|
return t.HookAction()
|
|
|
|
|
|
})
|
|
|
|
|
|
if !next {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
// 获取己方当前宠物和对方当前宠物
|
|
|
|
|
|
selfPet := our.FightC.GetCurrPET(our.Player)
|
|
|
|
|
|
//没血就切换精灵
|
|
|
|
|
|
if selfPet.Info.Hp <= 0 {
|
|
|
|
|
|
for _, v := range our.AllPet {
|
|
|
|
|
|
if v.Info.Hp > 0 {
|
2026-02-07 01:12:46 +08:00
|
|
|
|
// println("AI出手,切换宠物")
|
2026-01-21 20:46:05 +00:00
|
|
|
|
our.FightC.ChangePet(our.Player, v.Info.CatchTime)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 如果没有可用宠物,则直接返回,不执行任何操作
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
//oppPet := opp.FightC.GetCurrPET(opp.Player)
|
|
|
|
|
|
skills := selfPet.Skills
|
|
|
|
|
|
|
|
|
|
|
|
// 空技能列表直接返回,避免错误
|
|
|
|
|
|
if len(skills) == 0 {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2026-02-07 01:12:46 +08:00
|
|
|
|
//println("AI出手,选择技能")
|
2026-01-22 14:29:08 +08:00
|
|
|
|
var usedskill *info.SkillEntity
|
2026-01-21 20:46:05 +00:00
|
|
|
|
for _, s := range skills {
|
|
|
|
|
|
if s == nil {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
if !s.CanUse() {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
// 计算技能对对方的伤害(假设CalculatePower返回伤害值,或需从技能中获取)
|
|
|
|
|
|
s.DamageValue = our.CalculatePower(our.Opp, s)
|
|
|
|
|
|
|
|
|
|
|
|
// 判断是否能秒杀(伤害 >= 对方当前生命值)
|
2026-01-29 13:59:48 +08:00
|
|
|
|
if s.DamageValue.Cmp(our.Opp.CurrentPet.GetHP()) != -1 { // 假设oppPet.HP为对方当前剩余生命值
|
|
|
|
|
|
|
|
|
|
|
|
if usedskill != nil {
|
|
|
|
|
|
if s.DamageValue.Cmp(usedskill.DamageValue) != -1 {
|
|
|
|
|
|
usedskill = s
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
usedskill = s
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-21 20:46:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-02-20 09:40:22 +08:00
|
|
|
|
Shuffle(skills)
|
2026-01-22 14:29:08 +08:00
|
|
|
|
if usedskill == nil {
|
2026-01-21 20:46:05 +00:00
|
|
|
|
|
|
|
|
|
|
for _, s := range skills {
|
|
|
|
|
|
if s == nil {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
if !s.CanUse() {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
2026-01-22 14:29:08 +08:00
|
|
|
|
usedskill = s
|
|
|
|
|
|
|
2026-01-21 20:46:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2026-01-22 14:29:08 +08:00
|
|
|
|
if usedskill != nil {
|
2026-03-09 18:49:51 +08:00
|
|
|
|
our.FightC.UseSkill(our.Player, uint32(usedskill.XML.ID))
|
2026-01-22 14:29:08 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
our.FightC.UseSkill(our.Player, 0)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-21 20:46:05 +00:00
|
|
|
|
}
|