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