package info

import (
	element "blazing/common/data/Element"
	"blazing/common/data/xmlres"

	"blazing/modules/blazing/model"
	"math/rand"
	"sync"
)

// 战斗属性类型
type EnumAttrType int

// 辅助函数：取整数绝对值（处理负等级）
func abs(x int8) int8 {
	if x < 0 {
		return -x
	}
	return x
}

type BattlePetEntity struct {
	xmlres.PetInfo
	Info *model.PetInfo //通过偏移赋值
	//*input.Input

	statusConditions sync.Map        // key: StatusCondition, value: int (剩余回合)
	Skills           [4]*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
	for i := 0; i < 4; i++ {
		//todo  技能信息应该每回合进行深拷贝,保证每次的技能效果都是不一样的
		ret.Skills[i] = 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) Type() *element.ElementCombination {
	var ff *element.ElementCombination
	for _, v := range xmlres.PetMAP {
		if v.ID == int(u.Info.ID) {
			ff, _ = element.NewElementCombination(v.Type)
		}

	}

	return ff
}

