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()) // } //}