87 lines
2.3 KiB
Go
87 lines
2.3 KiB
Go
package input
|
||
|
||
import (
|
||
"blazing/common/utils"
|
||
"blazing/logic/service/common"
|
||
"blazing/logic/service/fight/info"
|
||
|
||
"github.com/jinzhu/copier"
|
||
)
|
||
|
||
type Input struct {
|
||
CanChange bool //是否可以死亡切换CanChange
|
||
CurrentPet *info.BattlePetEntity //当前精灵
|
||
AllPet []*info.BattlePetEntity
|
||
Player common.PlayerI
|
||
Finished bool //是否加载完成
|
||
*info.AttackValue
|
||
FightC common.FightI
|
||
// info.BattleActionI
|
||
Effects *utils.OrderedMap[int, Effect] //effects 实际上全局就是effect无限回合 //effects容器 技能的
|
||
DamageZone map[info.EnumDamageType]int //伤害容器
|
||
First bool //是否先手
|
||
}
|
||
|
||
func NewInput(c common.FightI, p common.PlayerI) *Input {
|
||
ret := &Input{FightC: c, Player: p}
|
||
ret.Effects = utils.NewOrderedMap[int, Effect]()
|
||
ret.DamageZone = make(map[info.EnumDamageType]int)
|
||
// t := Geteffect(EffectType.Damage, 0)
|
||
// t.Effect.SetArgs(ret)
|
||
// ret.AddEffect(t) //添加默认基类,实现继承
|
||
p.SetFightC(c) //给玩家设置战斗容器
|
||
|
||
return ret
|
||
|
||
}
|
||
func (i *Input) GetPetInfo() *info.BattlePetEntity {
|
||
|
||
return i.CurrentPet
|
||
|
||
}
|
||
|
||
// 这个每回合都会调用
|
||
func (i *Input) InitAttackValue() {
|
||
i.AttackValue = info.NewAttackValue(i.Player.GetInfo().UserID)
|
||
|
||
}
|
||
func (i *Input) GetPet(id uint32) (ii *info.BattlePetEntity, Reason info.ChangePetInfo) {
|
||
for _, v := range i.AllPet {
|
||
if v.Info.CatchTime == uint32(id) {
|
||
copier.Copy(&Reason, &v.Info)
|
||
Reason.UserId = i.Player.GetInfo().UserID
|
||
|
||
ii = v
|
||
}
|
||
|
||
}
|
||
return
|
||
|
||
}
|
||
|
||
// GetStatusBonus 获取最高的状态倍率
|
||
// 遍历状态数组,返回存在的状态中最高的倍率(无状态则返回1.0)
|
||
func (i *Input) GetStatusBonus() float64 {
|
||
// 异常状态倍率映射表(状态索引 -> 倍率)
|
||
var statusBonuses = map[info.EnumBattleStatus]float64{
|
||
info.PetStatus.Paralysis: 1.5,
|
||
info.PetStatus.Poisoned: 1.5,
|
||
info.PetStatus.Sleep: 2.0,
|
||
// /info.BattleStatus.Frozen: 2.0,
|
||
}
|
||
maxBonus := 1.0 // 默认无状态倍率
|
||
|
||
for statusIdx := 0; statusIdx < 20; statusIdx++ {
|
||
t := Geteffect(EffectType.Status, statusIdx)
|
||
|
||
// 检查状态是否存在(数组中值为1表示存在该状态)
|
||
if t.ID != 0 && t.Effect.Stack() > 0 {
|
||
if bonus, exists := statusBonuses[info.EnumBattleStatus(statusIdx)]; exists && bonus > maxBonus {
|
||
maxBonus = bonus
|
||
}
|
||
}
|
||
}
|
||
|
||
return maxBonus
|
||
}
|