package input import ( element "blazing/common/data/Element" "blazing/logic/service/fight/info" "github.com/mohae/deepcopy" "github.com/shopspring/decimal" ) func (u *Input) Death() { u.CurrentPet.Info.Hp = 0 //todo 待实现死亡effet } // 1是添加,-1是减少,0是清除 func (u *Input) SetProp(prop, level int) { if level == 0 { //说明是消强 //todo 消强交互 } //todo 待交互 u.AttackValue.Prop[prop] = u.AttackValue.Prop[prop] + int8(level) //todo 待交互 } func (i *Input) GetAction(opp *Input) { //使用1#技能,实际上要按照四个技能权重去使用 i.FightC.UseSkill(i.Player, int32(i.FightC.GetCurrPET(i.Player).Skills[0].ID)) } // todo获取属性,待实现获取后改回原属性 func (i *Input) Prop(in *Input, f func()) { oldour := deepcopy.Copy(i.CurrentPet).(*info.BattlePetEntity) //oldouo := deepcopy.Copy(opp.CurrentPet).(*info.BattlePetEntity) i.Exec(func(t Effect) bool { //属性获取前 t.BeferAttr(i.CurrentPet) //使XX为XX return true }) oldourr := deepcopy.Copy(in.CurrentPet).(*info.BattlePetEntity) in.Exec(func(t Effect) bool { //属性获取后 t.AfterAttr(i.CurrentPet) //视为xx 需要在里面判断来源 return true }) f() in.CurrentPet = oldourr i.CurrentPet = oldour //恢复 //opp.CurrentPet = oldouo //恢复 } func (i *Input) Skill(in *info.SkillEntity, f func()) { oldour := deepcopy.Copy(i.CurrentPet).(*info.SkillEntity) //oldouo := deepcopy.Copy(opp.CurrentPet).(*info.BattlePetEntity) i.Exec(func(t Effect) bool { //属性获取前 t.BeforeSkill(i,in) //使XX为XX return true }) in = oldour //恢复 } // 计算技能威力 func (i *Input) CalculatePower(deftype *Input, skill *info.SkillEntity) decimal.Decimal { // 1. 计算等级因子 (level * 0.4 + 2) levelFactor := decimal.NewFromInt(int64(i.CurrentPet.Info.Level)). Mul(decimal.NewFromFloat(0.4)).Add(decimal.NewFromInt(2)) var ( attackDec decimal.Decimal //攻击值 defenseDec decimal.Decimal //防御值 ) switch skill.Category() { //判断技能类型 case info.Category.PHYSICAL: i.Prop(i, func() { //我方取我方攻击 attackDec = decimal.NewFromInt(int64(i.CurrentPet.Info.Prop[0])) }) deftype.Prop(i, func() { //我方取敌方防御 defenseDec = decimal.NewFromInt(int64(deftype.CurrentPet.Info.Prop[1])) }) case info.Category.SPECIAL: i.Prop(i, func() { //我方取我方攻击 attackDec = decimal.NewFromInt(int64(i.CurrentPet.Info.Prop[2])) }) deftype.Prop(i, func() { //我方取敌方防御 defenseDec = decimal.NewFromInt(int64(deftype.CurrentPet.Info.Prop[3])) }) default: return decimal.NewFromInt(0) } // 5. 基础伤害公式:等级因子 * 威力因子 * 攻击 / 防御 / 50 + 2 baseDamage := levelFactor. Mul(decimal.NewFromInt(int64(skill.Power))). Mul(attackDec). Div(defenseDec). Div(decimal.NewFromInt(50)). Add(decimal.NewFromInt(2)) var typeRate decimal.Decimal deftype.Prop(i, func() { //我方取敌方属性,得到敌方的实际和我方的视为 t, _ := element.NewElementCalculator().GetOffensiveMultiplier(skill.Type().ID, deftype.CurrentPet.Type().ID) typeRate = decimal.NewFromFloat(t) }) damage := baseDamage. Mul(skill.CriticalsameTypeBonus()). // 同属性加成 Mul(typeRate). // 克制系数 Mul(skill.Criticalrandom()) //随机波动 return damage }