go_dreamfactory/modules/battle/fight/skill/fightafterskill.go
2022-10-12 10:13:04 +08:00

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
}