159 lines
4.5 KiB
Go
159 lines
4.5 KiB
Go
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
|
|
}
|