refactor(fight): 重构战斗系统
- 重构了 BattleSkillEntity 结构,改名为 SkillEntity - 优化了 Input 结构,移除了冗余的 Effect 容器 - 调整了 Effect 接口,增加了 SetInput 和 Alive 方法 - 重构了战斗逻辑中的技能使用和效果处理流程 - 优化了代码结构,提高了可读性和可维护性
This commit is contained in:
@@ -18,7 +18,7 @@ type Input struct {
|
||||
*info.AttackValue
|
||||
FightC common.FightI
|
||||
// info.BattleActionI
|
||||
Effect NodeManager //effects容器 技能的
|
||||
Effects []Effect //effects 实际上全局就是effect无限回合 //effects容器 技能的
|
||||
// Prop NodeManager //属性容器
|
||||
// Status NodeManager //状态容器
|
||||
//NewSeIdx NodeManager //全局容器
|
||||
@@ -29,8 +29,8 @@ type Input struct {
|
||||
func NewInput(c common.FightI, p common.PlayerI) *Input {
|
||||
ret := &Input{FightC: c, Player: p}
|
||||
t := NodeM[1000000]
|
||||
ret.Effect.AddEffect(deepcopy.Copy(t).(Effect)) //添加默认基类,实现继承
|
||||
p.SetFightC(c) //给玩家设置战斗容器
|
||||
ret.AddEffect(deepcopy.Copy(t).(Effect)) //添加默认基类,实现继承
|
||||
p.SetFightC(c) //给玩家设置战斗容器
|
||||
return ret
|
||||
|
||||
}
|
||||
|
||||
@@ -8,9 +8,9 @@ import (
|
||||
type Effect interface {
|
||||
OnBattleStart() bool //战斗开始
|
||||
|
||||
OnTurnStart(attacker, defender *Input) bool //回合开始
|
||||
OnTurnStart(opp *Input) bool //回合开始
|
||||
|
||||
UseSkill(attacker, defender *Input) bool //使用技能 可以取消用技能节点
|
||||
UseSkill(opp *Input) bool //使用技能 可以取消用技能节点
|
||||
// OnSkillPP() bool //技能PP减少节点
|
||||
// BeforeMultiHit() bool //多段攻击前
|
||||
// BeforeHit() bool //命中前
|
||||
@@ -19,13 +19,15 @@ type Effect interface {
|
||||
// OnBeforeCalculateDamage() bool // 最终伤害计算前触发
|
||||
// OnDamage() bool // 造成伤害时触发
|
||||
//使用技能 可以取消用技能节点
|
||||
SetInput(input *Input)
|
||||
SetArgs(param []int)
|
||||
IsCrit(attacker, defender *Input, skill *info.BattleSkillEntity) //是否暴击
|
||||
CalculateDamage(attacker, defender *Input, skill *info.BattleSkillEntity) //击判定成功且伤害计算前触发
|
||||
IsCrit(opp *Input, skill *info.SkillEntity) //是否暴击
|
||||
CalculateDamage(opp *Input, skill *info.SkillEntity) //击判定成功且伤害计算前触发
|
||||
OnBeforeCalculateDamage(opp *Input, skill *info.SkillEntity) // 最终伤害计算前触发
|
||||
// Shield() bool // 护盾值变化时触发
|
||||
// PostDamage() bool // 伤害结算后触发(血量扣除后)
|
||||
IsHit(attacker, defender *Input, skill *info.BattleSkillEntity) //闪避率计算,,实际上是修改命中的判断
|
||||
TakeHit(attacker, defender *Input, skill *info.BattleSkillEntity) //闪避率计算,,实际上是修改命中的判断
|
||||
IsHit(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断
|
||||
TakeHit(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断
|
||||
//() bool // 暴击伤害结算后触发
|
||||
|
||||
// OnHit() bool // 技能命中时触发
|
||||
@@ -65,20 +67,13 @@ type Effect interface {
|
||||
Duration(int) int
|
||||
ID() int
|
||||
GetArgSize() int
|
||||
Alive() bool
|
||||
Stack(int) int
|
||||
MaxStack() int
|
||||
GetOwner() bool // 技能属主,比如寄生和镇魂歌,属主是对方)
|
||||
//GetSkill() *BattleSkillEntity //获得技能ctx
|
||||
}
|
||||
|
||||
// ========================
|
||||
// 容器:存放多个效果
|
||||
// ========================
|
||||
type NodeManager struct {
|
||||
//GlobalEffects []*Effect // 全局常驻/回合/次数效果
|
||||
Effects []Effect //effects 实际上全局就是effect无限回合
|
||||
}
|
||||
|
||||
var NodeM = make(map[int]Effect, 0)
|
||||
|
||||
func InitSkillEffect(id int, t Effect) {
|
||||
@@ -103,7 +98,7 @@ func getTypeName(v interface{}) string {
|
||||
return t.Kind().String()
|
||||
}
|
||||
|
||||
func (c *NodeManager) AddEffect(e Effect) {
|
||||
func (c *Input) AddEffect(e Effect) {
|
||||
|
||||
// 如果已有同 ID 的效果,尝试叠加
|
||||
for _, eff := range c.Effects {
|
||||
@@ -116,6 +111,7 @@ func (c *NodeManager) AddEffect(e Effect) {
|
||||
|
||||
eff.Duration(eff.Duration(0))
|
||||
}
|
||||
eff.SetInput(c) //设置输入源
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -124,7 +120,7 @@ func (c *NodeManager) AddEffect(e Effect) {
|
||||
}
|
||||
|
||||
// 删除
|
||||
func (c *NodeManager) RemoveEffect(e Effect) {
|
||||
func (c *Input) RemoveEffect(e Effect) {
|
||||
var remain []Effect
|
||||
for _, eff := range c.Effects {
|
||||
if eff.ID() != e.ID() {
|
||||
@@ -137,28 +133,29 @@ func (c *NodeManager) RemoveEffect(e Effect) {
|
||||
// ForEachEffectBool 遍历所有 Effect,执行“无参数、返回 bool”的方法
|
||||
// 参数 fn:接收单个 Effect,返回 bool(如 func(e Effect) bool { return e.OnBattleStart() })
|
||||
// 返回值:所有 Effect 的方法返回值列表
|
||||
func (c *NodeManager) Exec(fn func(Effect) bool) bool {
|
||||
func (c *Input) Exec(fn func(Effect) bool) bool {
|
||||
|
||||
var results bool
|
||||
// if len(c.Effects) == 0 {
|
||||
// return true
|
||||
// }
|
||||
|
||||
for _, effect := range c.Effects {
|
||||
result := fn(effect)
|
||||
if !result {
|
||||
results = result //如果是false,说明存在阻止向下执行的effect,比如免疫能力提升效果
|
||||
if effect.Alive() {
|
||||
result := fn(effect)
|
||||
if !result {
|
||||
results = result //如果是false,说明存在阻止向下执行的effect,比如免疫能力提升效果
|
||||
}
|
||||
|
||||
if result {
|
||||
results = true
|
||||
}
|
||||
}
|
||||
|
||||
if result {
|
||||
results = true
|
||||
}
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
|
||||
// 消除回合类效果 efftype 输入是消对方的还是自己的,false是自己,true是对方
|
||||
func (c *NodeManager) CancelTurn(efftype bool) {
|
||||
func (c *Input) CancelTurn(efftype bool) {
|
||||
|
||||
var remain []Effect
|
||||
for _, eff := range c.Effects {
|
||||
|
||||
Reference in New Issue
Block a user