Files
bl/logic/service/fight/info/BattlePetEntity.go

96 lines
2.4 KiB
Go
Raw Normal View History

package info
import (
element "blazing/common/data/Element"
"blazing/common/data/xmlres"
"blazing/modules/player/model"
"math/rand"
"github.com/alpacahq/alpacadecimal"
)
// 战斗属性类型
type EnumAttrType int
type BattlePetEntity struct {
xmlres.PetInfo
2025-11-15 23:02:46 +00:00
Info model.PetInfo //通过偏移赋值
//*input.Input
//PType int
Skills map[uint32]*SkillEntity // 技能槽最多4个技能
//Status StatusDict //精灵的状态
//能力提升属性
//Prop PropDict
NotAlive bool `struc:"skip"`
//DamageZone map[EnumCategory]map[EnumsZoneType]map[EnumsZoneType][]float64 // 三维map 伤害类型-》增还是减-》加还是乘-》值
}
// 创建精灵实例
2025-11-15 23:02:46 +00:00
func CreateBattlePetEntity(info model.PetInfo, rand *rand.Rand) *BattlePetEntity {
ret := &BattlePetEntity{}
ret.PetInfo = xmlres.PetMAP[int(info.ID)] //注入精灵信息
ret.Info = info
2025-11-23 23:38:03 +00:00
ret.Skills = make(map[uint32]*SkillEntity)
for i := 0; i < len(info.SkillList); i++ {
//todo 技能信息应该每回合进行深拷贝,保证每次的技能效果都是不一样的
ret.Skills[info.SkillList[i].ID] = CreateSkill(&info.SkillList[i], rand, ret)
}
return ret
}
// calculateRealValue 计算实际属性值根据状态变化计算实际值
// value 基础属性值
// stat 状态变化值(可正可负)
// 返回// 返回计算后的实际属性值确保结果至少为1
func CalculateRealValue(value int, stat int) int {
if stat == 0 {
if value <= 0 {
return 1
}
return value
} else if stat > 0 {
r := int(float64(value) * (float64(stat+2) / 2.0))
if r <= 0 {
return 1
}
return r
} else {
r := int(float64(value) * (2.0 / float64(2-stat)))
if r <= 0 {
return 1
}
return r
}
}
func (u *BattlePetEntity) GetHP() alpacadecimal.Decimal {
return alpacadecimal.NewFromInt(int64(u.Info.Hp))
}
func (u *BattlePetEntity) GetMaxHP() alpacadecimal.Decimal {
return alpacadecimal.NewFromInt(int64(u.Info.MaxHp))
}
func (u *BattlePetEntity) GetType() *element.ElementCombination {
// 1. 遍历宠物配置查找对应元素类型ID
// 3. 从预加载的组合池中获取实例(无需创建,直接读取)
combo, err := element.Calculator.GetCombination(u.PetInfo.Type)
if err != nil {
// 极端情况typeID无效强制使用默认普通属性
// (从池中获取默认值,确保实例一致性)
combo, _ = element.Calculator.GetCombination(8)
}
return combo
}