package gmmodule

//import (
//	"encoding/json"
//	"leafstalk/covenant/model"
//	"leafstalk/log"
//	"os"
//)
//
//// 计算玩家攻击力、血量、闪避
//
//type PlayerBattleAttr struct {
//	RoleId      int64
//	State       int                 //战斗状态 0死亡 1后台 2出战
//	Atk         int64               //基础攻击
//	AtkUp       float64             //伤害加成 1
//	Def         int64               //基础防御
//	DefUp       float64             //防御加成 1
//	Hp          int64               //基础血量
//	CurrentHp   int64               //当前血量
//	HpUp        float64             //生命加成 1
//	AtkSpeed    float64             //射速
//	AtkSpeedUp  float64             //攻速加成 1
//	Shift       int                 //偏移
//	ShiftUp     float64             //精准度提升 1 shiftUp
//	LukUp       float64             //暴击加成 0 crit
//	AvdUp       float64             //闪避加成 0 dodge
//	CrtUp       float64             //暴伤加成 1 critHarm
//	BossUp      float64             //BOSS伤害加成
//	MonUp       float64             //小怪伤害加成
//	InLukUp     float64             //游戏内暴击加成 0 crit  // 客户端实际也可能是暴击率加成 critUp
//	InAvdUp     float64             //游戏内闪避加成 0 dodge
//	HpDown      float64             //血量扣除
//	EleType     int64               //元素类型
//	EleAtk      int64               //基础元素伤害
//	EleAtkUp    float64             //基础元素伤害加成
//	EleAllDef   [MaxElement]int64   //元素减伤
//	EleAllDefUp [MaxElement]float64 //元素减伤减伤加成
//}
//
//const (
//	/**攻击力*/
//	TalentAtk = 1
//	/**射速 */
//	TalentAtkSpeedUp = 2
//	/**暴击 */
//	TalentLuck = 3
//	/**暴击伤害 */
//	TalentCrit = 4
//	/**生命值 */
//	TalentHp = 5
//	/**免伤 */
//	TalentDef = 6
//	// /**红心恢复固定值 */
//	// TalentHpUPbloodUpNum = 7
//	// /**升级恢复固定值 */
//	// TalentUPLevelHpNum = 8
//	/**闪避 */
//	TalentAvd = 9
//	/**BOSS伤害 */
//	TalentBossUP = 10
//	/**怪物伤害 */
//	TalentMonUP = 11
//	/**高品质技能获得概率增加 */
//	// TalentLuckySkill = 12
//	/**换弹速度 */
//	// TalentReloadTimeUp = 13
//	/**降低机关伤害 */
//	// TalentBackstabberHarm = 14
//	/**等级上限 */
//	// TalentLevelLimit = 16
//)
//
//const (
//	/**生命增加 */
//	SkillHp = 2
//	/**金币加成 */
//	// SkillCoinUp = 4,
//	/** 攻击加成*/
//	SkillAtkUp = 6
//	/**换弹加成 */
//	// SkillReloadTimeUp = 8
//	/**降低机关伤害 */
//	// SkillBackstabberHarm = 10
//	/**免伤加成 */
//	SkillDefUp = 11
//	/**暴击伤害 */
//	SkillCrit = 13
//	/**弹道偏移 */
//	SkillShiftUp = 14
//	/**弹夹加成 */
//	// SkillBulletNumUp = 16
//	/**攻击伤害 */
//	SkillAtk = 20
//	/**闪避加成 */
//	SkillAvd = 22
//	// 触发暴击概率
//	SkilTrigLuck = 7
//	// 触发攻速
//	SkillTrigAtkSpeedUp1 = 15
//	// 触发攻速
//	SkillTrigAtkSpeedUp2 = 16
//	// 触发伤害提升
//	SkillTrigAtkUp = 17
//	// 触发暴击概率
//	SkilTriglLuck2 = 18
//)
//
//const (
//	SelectSkillAtkUp      = 0 //伤害提升%
//	SelectSkillAtkSpeedUp = 1 //射速提升%
//	SelectSkillShiftUp    = 2 // 弹道偏移
//	SelectSkillAvd        = 3 //闪避加成%
//	SelectSkilLuck        = 4 //暴击概率%
//	SelectSkillHpUp       = 5 //血量加成%
//	// SelectSkillAtkUp      = 6 //换单速度
//	// SelectSkillAtkUp = 7 //击杀怪物恢复血量
//	SelectSkillCritUp = 8 //暴击伤害加成
//	// SelectSkill     = 9  //双重射击
//	// SelectSkill     = 10 //扩充弹夹
//	// SelectSkill     = 11 //蜘蛛炸弹-冰
//	// SelectSkill     = 12 //蜘蛛炸弹-火
//	// SelectSkill     = 13 //蜘蛛炸弹-雷
//	// SelectSkill     = 14 //蜘蛛炸弹-毒
//	// SelectSkill     = 15 //低级治疗
//	// SelectSkill     = 16 //弹射子弹
//	// SelectSkill     = 17 //跟踪飞弹
//	// SelectSkill     = 18 //爆头
//	// SelectSkill = 19 //旋转盾牌
//	// SelectSkill = 20 //治疗增幅
//	// SelectSkill = 21 //无敌
//	// SelectSkill = 22 //神佑
//	// SelectSkill = 23 //愤怒
//	// SelectSkill = 24 //火焰灵符
//	// SelectSkill = 25 //寒冰灵符
//	// SelectSkill = 26 //闪电灵符
//	// SelectSkill = 27 //巫毒灵符
//	// SelectSkill = 28 //死亡冰冻
//	// SelectSkill = 29 //死亡爆炸
//	// SelectSkill = 30 //机关术
//	// SelectSkill = 31 //唤灵
//	// SelectSkill = 32 //多重子弹
//	SelectSkillAtkUp2      = 33 //弹药专家（中）
//	SelectSkillAtkSpeedUp2 = 34 //高速子弹（中）
//	SelectSkillAvd2        = 35 //身手敏捷（中）
//	SelectSkillLuck2       = 36 //专注射击（中）
//	SelectSkillHpUp2       = 37 //肾上腺素（中）
//	SelectSkillCritUp2     = 38 //高效杀伤（中）
//	// SelectSkill            = 39 //扩容弹夹（中）
//	SelectSkillAtkUp3      = 40 //弹药专家（大）
//	SelectSkillAtkSpeedUp3 = 41 //高速子弹（大）
//	SelectSkillAvd3        = 42 //身手敏捷（大）
//	SelectSkillLuck3       = 43 //专注射击（大）
//	SelectSkillHpUp3       = 44 //肾上腺素（大）
//	SelectSkillCritUp3     = 45 //高效杀伤（大）
//	// SelectSkill            = 46 //扩容弹夹（大）
//)
//
//const (
//	BodyPartWeapon = 1
//	BodyPartHead   = 2
//	BodyPartChest  = 3
//	BodyPartNeck   = 4
//	BodyPartGlove  = 5
//	BodyPartRing   = 6
//)
//
//const (
//	// UnElement 无元素
//	UnElement = 0
//	// MetalElement 金
//	GoldElement = 1
//	// WoodElement 木
//	WoodElement = 2
//	// WaterElement 水
//	WaterElement = 3
//	// FireElement 火
//	FireElement = 4
//	// SoilElement 土
//	SoilElement = 5
//	// MaxElement .
//	MaxElement = 6
//)
//
//var (
//	allEquipsAttr   map[int64]*model.EquipBattleAttr
//	allRolesAttr    map[int64]*model.RoleBattleAttr
//	allTalentAttr   map[int]*model.PlayerTalentAttr
//	allSkills       []*model.RoleSkill
//	allSelectSkills []*model.SelectSkill
//)
//
//func NewPlayerBattleAttr() *PlayerBattleAttr {
//	ba := &PlayerBattleAttr{
//		AtkUp:      1,
//		DefUp:      1,
//		HpUp:       1,
//		AtkSpeedUp: 1,
//		CrtUp:      1,
//		ShiftUp:    1,
//		BossUp:     1,
//		MonUp:      1,
//	}
//	return ba
//}
//
//func CalcBattleAttr(equips []int64, role int64, talents map[int]int, allRoles []int64) *PlayerBattleAttr {
//
//	//初始值
//	ba := NewPlayerBattleAttr()
//
//	//装备
//	roleRadio := AddEquipAttr(ba, equips)
//
//	//角色
//	AddRoleAttr(ba, role, roleRadio)
//	ra, ok := allRolesAttr[role]
//	if ok {
//		AddRoleSkill(ba, ra.Skill, 2)
//	}
//
//	for _, v := range allRoles {
//		ra, ok := allRolesAttr[v]
//		if !ok {
//			continue
//		}
//		AddRoleSkill(ba, ra.Skill, 1)
//	}
//
//	//天赋
//	AddTalent(ba, talents)
//
//	//结果
//	ba.AtkSpeed = ba.AtkSpeed / ba.AtkSpeedUp
//	ba.Atk = int64(float64(ba.Atk) * ba.AtkUp)
//	ba.Hp = int64(float64(ba.Hp) * ba.HpUp)
//	ba.Def = int64(float64(ba.Def) * ba.DefUp)
//	ba.Shift = int(float64(ba.Shift) / ba.ShiftUp)
//	log.Debugf("CalcBattleAttr %#v", *ba)
//	return ba
//}
//
//// 增加装备属性
//func AddEquipAttr(player *PlayerBattleAttr, equips []int64) (roleRadio float64) {
//	getPart := func(id int64) int {
//		return int(id / 10_000_000)
//	}
//
//	for _, v := range equips {
//		part := getPart(v)
//		at, ok := allEquipsAttr[v]
//		if !ok {
//			continue
//		}
//		switch part {
//		case BodyPartWeapon:
//			player.Atk += at.Atk
//			player.AtkSpeed += float64(at.AtkSpeed)
//			player.Shift += at.Shift
//			roleRadio = at.RoleRadio
//		case BodyPartHead:
//			player.Def += at.Def
//		case BodyPartChest:
//			player.Hp += at.Hp
//		case BodyPartNeck:
//			player.Hp += at.Hp
//		case BodyPartGlove:
//			player.Def += at.Def
//		case BodyPartRing:
//			player.Hp += at.Hp
//		}
//		player.AtkSpeedUp += at.AtkSpeedUp * 0.01
//		player.LukUp += at.LukUp
//		player.AtkUp += at.AtkUp * 0.01
//		player.CrtUp += at.CrtUp * 0.01
//		player.HpUp += at.HpUp * 0.01
//		player.DefUp += at.DefUp * 0.01
//		player.AvdUp += at.AvdUp
//		player.ShiftUp += at.AccuUp * 0.01
//		player.BossUp += at.BossUp * 0.01
//		player.MonUp += at.MonUp * 0.01
//	}
//	return
//}
//
//// 增加角色属性
//func AddRoleAttr(player *PlayerBattleAttr, role int64, roleRadio float64) {
//	ra, ok := allRolesAttr[role]
//	if !ok {
//		return
//	}
//
//	player.Atk += int64(float64(ra.Atk) / roleRadio)
//	player.Hp += ra.Hp
//	player.LukUp += ra.LuckUp
//	player.CrtUp += ra.CrtUp * 0.01
//	player.AtkSpeedUp += ra.AtkSpeedUp * 0.01
//	player.AvdUp += ra.AvdUp
//}
//
//// 增加角色技能提升 skillRange=1，仅增加全体技能属性； skillRange=2，仅增加单体技能属性; skillRange=3，增加单体和全体技能属性;
//func AddRoleSkill(player *PlayerBattleAttr, skills []int, skillRange int) {
//	for _, v := range skills {
//		sk := getSkill(v)
//
//		// 非角色技能
//		if sk.Range < 0 {
//			continue
//		}
//
//		if skillRange == 1 {
//			if sk.Range != 0 {
//				continue
//			}
//		} else if skillRange == 2 {
//			if sk.Range != 1 {
//				continue
//			}
//		} //else {		}
//
//		//以下无触发型技能
//		switch sk.Type {
//		case SkillHp:
//			player.Hp += int64(sk.Skill[0])
//		case SkillAtkUp:
//			player.AtkUp += sk.Skill[0]
//		case SkillDefUp:
//			player.DefUp += sk.Skill[0]
//		case SkillCrit:
//			player.CrtUp += sk.Skill[0]
//		case SkillShiftUp:
//			player.ShiftUp += sk.Skill[0]
//		case SkillAtk:
//			player.Atk += int64(sk.Skill[0])
//		case SkillAvd:
//			player.AvdUp += sk.Skill[0] * 100
//		}
//	}
//}
//
//// 游戏内选择技能的加成
//func AddSelectSkill(player *PlayerBattleAttr, skills map[int]int) {
//	for k, v := range skills {
//		sk := getSelectSkill(k)
//		if sk.Times == 1 {
//			v = 1
//		}
//
//		up := sk.Value[0] * v
//		if up > sk.Max {
//			up = sk.Max
//		}
//
//		//以下无触发型技能
//		switch sk.Type {
//		case SelectSkillAtkUp:
//			player.AtkUp += float64(up) * 0.01
//		case SelectSkillCritUp:
//			player.CrtUp += float64(up) * 0.01
//		case SelectSkillShiftUp:
//			player.ShiftUp += float64(up) * 0.01
//		case SelectSkillAvd:
//			player.AvdUp += float64(up)
//		case SelectSkillAtkSpeedUp:
//			player.AtkSpeedUp += float64(up) * 0.01
//		case SelectSkilLuck:
//			player.LukUp += float64(up)
//		case SelectSkillHpUp:
//			player.HpUp += float64(up) * 0.01
//		}
//	}
//}
//
//// 增加天赋属性
//func AddTalent(player *PlayerBattleAttr, talents map[int]int) {
//	getTalent := func(id int) *model.PlayerTalentAttr {
//		for _, v := range allTalentAttr {
//			if v.ID == id {
//				return v
//			}
//		}
//		return nil
//	}
//	for k, v := range talents {
//		tv := getTalent(k)
//		if tv == nil {
//			continue
//		}
//
//		val := tv.UpValue * float64(v)
//		switch tv.ID {
//		case TalentAtk:
//			player.Atk += int64(val)
//		case TalentAtkSpeedUp:
//			player.AtkSpeedUp += val //* 0.001
//		case TalentLuck:
//			player.LukUp += val //* 0.001
//		case TalentCrit:
//			player.CrtUp += val //* 0.001
//		case TalentHp:
//			player.Hp += int64(val)
//		case TalentDef:
//			player.Def += int64(val)
//		case TalentAvd:
//			player.AvdUp += val //* 0.001
//		case TalentBossUP:
//			player.BossUp += val //* 0.001
//		case TalentMonUP:
//			player.MonUp += val //* 0.001
//		}
//	}
//}
//
//func getSkill(id int) *model.RoleSkill {
//	for _, v := range allSkills {
//		if v.Id == id {
//			return v
//		}
//	}
//	return nil
//}
//
//func getSelectSkill(id int) *model.SelectSkill {
//	for _, v := range allSelectSkills {
//		if v.Id == id {
//			return v
//		}
//	}
//	return nil
//}
//
//func LoadBattleAttr(equipFile string, roleFile string, talentFile string, roleSkillFile string, selectSkillFile string) {
//
//	allEquipsAttr = make(map[int64]*model.EquipBattleAttr)
//	allRolesAttr = make(map[int64]*model.RoleBattleAttr)
//	allTalentAttr = make(map[int]*model.PlayerTalentAttr, 16)
//
//	loadJsonFile(equipFile, &allEquipsAttr)
//	loadJsonFile(roleFile, &allRolesAttr)
//	loadJsonFile(talentFile, &allTalentAttr)
//	loadJsonFile(roleSkillFile, &allSkills)
//	loadJsonFile(selectSkillFile, &allSelectSkills)
//
//}
//
//func loadJsonFile(filePath string, val interface{}) {
//	ptrFile, err := os.Open(filePath)
//	if err != nil {
//		log.Fatalln("读取json文件失败", err)
//	}
//	defer ptrFile.Close()
//
//	decoder := json.NewDecoder(ptrFile)
//	err = decoder.Decode(val)
//	if err != nil {
//		log.Fatalln("loadJsonFile Decoder failed ", filePath, err.Error())
//	}
//}
