package skill import ( "go_dreamfactory/modules/battle/fight/core" cfg "go_dreamfactory/sys/configure/structs" ) func NewFightAfterSkill(role core.IFightRole, skillConf *cfg.GameSkillAfteratkData) (skill *FightAfterSkill) { skill = &FightAfterSkill{} skill.Init(skill, role, skillConf) return } /// 子技能 type FightAfterSkill struct { SkillBase /// 当前技能对象 skill core.IAfterSkill fight core.IFight /// 从哪个角色的技能 OwnerRole core.IFightRole /// 子技能配置 AfterSkillConf *cfg.GameSkillAfteratkData ///技能目标 Targets []core.IFightRole /// 技能来源ID /// skillAtk id 主技能id /// skillAfterat id 子技能的后续子技能, 表示父技能 SourceSkillId int32 /// 技能参数 SkillArgs []int32 /// 子技能效果列表 ComList []*core.ComEffectSkill ///执行次数 DoVal int32 /// 技能效果是否生效 TakeEffect bool } func (this *FightAfterSkill) SetSourceSkillId(skill int32) { this.SourceSkillId = skill } func (this *FightAfterSkill) GetDoVal() int32 { return this.DoVal } /// 发送技能日志 func (this *FightAfterSkill) Init(askill core.IAfterSkill, role core.IFightRole, skillConf *cfg.GameSkillAfteratkData) { this.skill = askill this.fight = role.GetFight() this.OwnerRole = role this.AfterSkillConf = skillConf this.SkillArgs = skillConf.Argu } /// 触发技能 func (this *FightAfterSkill) Emit() bool { if this.skill.CheckEmit() { this.fight.Debugf("{%s}.{%d} 触发子技能:{%d}", this.OwnerRole.GetData().UniqueId, this.SourceSkillId, this.AfterSkillConf.Id) // 每个子技能执行前触发 this.fight.GetFightEvent().Emit(int(core.EventType_OnPreEffect), this.OwnerRole, this) this.skill.DoLogic() if this.TakeEffect { this.DoTakeEffectSK() } else { this.DoLoseEfficacySK() } this.skill.Clear() return true } return false } /// 检查是否符合释放条件 func (this *FightAfterSkill) CheckEmit() bool { randVal := this.fight.Rand(1, 1000) this.fight.Debugf("{%d} 的子技能 {%d} 触发几率判断:{%d}", this.SourceSkillId, this.AfterSkillConf.Id, randVal) if randVal > this.AfterSkillConf.EmitPR { return false } return true } func (this *FightAfterSkill) DoLogic() { this.fight.Debugf("子技能通用逻辑:{%d}", this.AfterSkillConf.Id) } ///技能效果生效之后触发调用 func (this *FightAfterSkill) DoTakeEffectSK() { this.fight.Debugf("技能效果生效成功触发:{%d}, SucFollowSK: {%d}", this.AfterSkillConf.Id, len(this.AfterSkillConf.SucFollowSK)) var ( askill core.IAfterSkill ) for _, v := range this.AfterSkillConf.SucFollowSK { askill = this.OwnerRole.GetAfterAtk(v) askill.SetSourceSkillId(this.AfterSkillConf.Id) if askill.Emit() { this.AddSkillLog(askill.GetSkillLog()) } } } ///技能效果失败之后触发调用 func (this *FightAfterSkill) DoLoseEfficacySK() { this.fight.Debugf("技能效果生效失败触发:{%d}, FailFollowSK: {%d}", this.AfterSkillConf.Id, len(this.AfterSkillConf.FailFollowSK)) var ( askill core.IAfterSkill ) for _, v := range this.AfterSkillConf.FailFollowSK { askill = this.OwnerRole.GetAfterAtk(v) askill.SetSourceSkillId(this.AfterSkillConf.Id) if askill.Emit() { this.AddSkillLog(askill.GetSkillLog()) } } } /// 释放成功后续子技能(有目标且满足概率) func (this *FightAfterSkill) DoFollowSK() { this.fight.Debugf("释放成功<后续子技能>触发:{%d}, FollowSK: {%d}", this.AfterSkillConf.Id, len(this.AfterSkillConf.FollowSK)) var ( askill core.IAfterSkill ) for _, v := range this.AfterSkillConf.FollowSK { askill = this.OwnerRole.GetAfterAtk(v) askill.SetSourceSkillId(this.AfterSkillConf.Id) if askill.Emit() { this.AddSkillLog(askill.GetSkillLog()) } } } func (this *FightAfterSkill) Clear() { this.TakeEffect = false } ///添加子技能日志 func (this *FightAfterSkill) AddSkillLog(afterAtk *core.ComSkillAfterAtk) { this.AfterSkillList = append(this.AfterSkillList, afterAtk) } ///获取自己的技能日志(子技能使用) func (this *FightAfterSkill) GetSkillLog() *core.ComSkillAfterAtk { afterAtk := core.NewComSkillAfterAtk() afterAtk.ComList = append(afterAtk.ComList, this.ComList...) if this.Targets != nil { for _, v := range this.Targets { afterAtk.Targets = append(afterAtk.Targets, v.GetData().Rid) } } afterAtk.FollowSkills = append(afterAtk.FollowSkills, this.AfterSkillList...) afterAtk.Skillid = this.AfterSkillConf.Id afterAtk.From = this.OwnerRole.GetData().Rid this.ComList = this.ComList[:0] this.AfterSkillList = this.AfterSkillList[:0] return afterAtk }