diff --git a/logic/service/fight/input/fight.go b/logic/service/fight/input/fight.go index 1ad639078..cc344aeea 100644 --- a/logic/service/fight/input/fight.go +++ b/logic/service/fight/input/fight.go @@ -6,6 +6,7 @@ import ( "blazing/logic/service/fight/action" "blazing/logic/service/fight/info" "fmt" + "math/rand" "github.com/shopspring/decimal" ) @@ -270,9 +271,64 @@ func (u *Input) SetProp(in *Input, prop, level int8, ptype info.EnumAbilityOpTyp return false } func (i *Input) GetAction(opp *Input) { - //使用1#技能,实际上要按照四个技能权重去使用 - i.FightC.UseSkill(i.Player, int32(i.FightC.GetCurrPET(i.Player).Skills[0].ID)) + // 获取己方当前宠物和对方当前宠物 + selfPet := i.FightC.GetCurrPET(i.Player) + //oppPet := opp.FightC.GetCurrPET(opp.Player) + skills := selfPet.Skills + // 空技能列表直接返回,避免错误 + if len(skills) == 0 { + return + } + + // 步骤1:计算所有技能的伤害,并筛选出能秒杀对方的技能 + var killableSkills []struct { + *info.SkillEntity // 技能对象(假设原技能类型为skill) + damage decimal.Decimal // 技能实际伤害 + } + // 存储所有技能及伤害(用于后续筛选) + type skillWithDamage struct { + *info.SkillEntity + damage decimal.Decimal + } + allSkills := make([]skillWithDamage, 0, len(skills)) + + for _, s := range skills { + // 计算技能对对方的伤害(假设CalculatePower返回伤害值,或需从技能中获取) + damage := i.CalculatePower(opp, s) + + if !s.CanUse() { + continue + } + allSkills = append(allSkills, skillWithDamage{SkillEntity: s, damage: damage}) + + // 判断是否能秒杀(伤害 >= 对方当前生命值) + if uint32(damage.IntPart()) >= opp.CurrentPet.Info.Hp { // 假设oppPet.HP为对方当前剩余生命值 + killableSkills = append(killableSkills, struct { + *info.SkillEntity + damage decimal.Decimal + }{s, damage}) + } + } + + // 若存在能秒杀的技能,优先使用(选权重最高的,避免浪费高伤害技能) + if len(killableSkills) > 0 { + bestKillSkill := killableSkills[0].SkillEntity + // maxWeight := killableSkills[0].SkillEntity.Weight // 假设技能有Weight字段表示权重 + // for _, ks := range killableSkills[1:] { + // if ks.skill.Weight > maxWeight { + // maxWeight = ks.skill.Weight + // bestKillSkill = ks.skill + // } + // } + i.FightC.UseSkill(i.Player, int32(bestKillSkill.ID)) + return + } + + randomIdx := rand.Intn(len(allSkills)) + chosenSkill := skills[randomIdx] + i.FightC.UseSkill(i.Player, int32(chosenSkill.ID)) + // i.FightC.UseSkill(i.Player, int32(bestSkill.skill.ID)) } // 计算技能威力