From 31b8a27eeb4d9beabb4a5535d8868ea908bc9632 Mon Sep 17 00:00:00 2001 From: 1 <1@72wo.cn> Date: Thu, 6 Nov 2025 20:21:43 +0000 Subject: [PATCH] =?UTF-8?q?refactor(fight):=20=E4=BC=98=E5=8C=96=E6=88=98?= =?UTF-8?q?=E6=96=97=E9=80=BB=E8=BE=91=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= =?UTF-8?q?=EF=BC=8C=E6=B8=85=E7=90=86=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logic/service/fight/input/fight.go | 60 +++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/logic/service/fight/input/fight.go b/logic/service/fight/input/fight.go index 1ad63907..cc344aee 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)) } // 计算技能威力