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 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 伤害类型-》增还是减-》加还是乘-》值 } // 创建精灵实例 func CreateBattlePetEntity(info model.PetInfo, rand *rand.Rand) *BattlePetEntity { ret := &BattlePetEntity{} ret.PetInfo = xmlres.PetMAP[int(info.ID)] //注入精灵信息 ret.Info = info 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 }