1 Star 0 Fork 0

liuxuezhan/mylib

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
prop.go 6.44 KB
一键复制 编辑 原始数据 按行查看 历史
liuxuezhan 提交于 2020-11-30 21:01 . 'gate ok'
package app
import (
"gitee.com/liuxuezhan/mylib/Protocol"
. "gitee.com/liuxuezhan/mylib/log"
)
// ============================================================================
// 属性Id 规则
// * 固定点属性: fixed = value [1, 99]
// * 百分比加成属性: pct = fixed + 1000 [1001, 1099]
// * 聚集加成属性: agr = fixed(pct) + 3000 + count*100 [3001, 4999]
const (
C_prop_min_pct_id = 1000
C_prop_min_aggregate_id = 3000
C_prop_pct_plus_id = 1000
)
// 固定属性 Id 含义
const (
PROP_PAtk = 10 // 物理攻击
PROP_MAtk = 11 // 魔法攻击
PROP_MDef = 13 // 魔法防御
PROP_PDef = 14 // 物理防御
PROP_Hp = 16 // 生命
PROP_Magic = 17 // 魔法值
PROP_MSpeed = 19 // 移动速度
PROP_DefDuce = 33 // 无视防御
PROP_Hit = 34 // 命中值
PROP_Dodge = 35 // 闪避值
PROP_Crit = 36 // 暴击值
PROP_CritRes = 37 // 抗暴值
PROP_CritDmg = 38 // 暴伤值
PROP_CritDmgRes = 39 // 暴伤抵抗值
PROP_DmgUp = 40 // 增伤值
PROP_DmgDown = 41 // 伤害减免
PROP_DmgBack = 42 // 伤害反弹
PROP_Blood = 43 // 吸血值
PROP_DmgExt = 44 // 额外伤害
PROP_DmgPct = 45 // 最终伤害百分比加成
PROP_SkillPct = 46 // 技能伤害百分比加成
PROP_SKillDmgDuce = 47 // 技能承伤减少
PROP_ExpAdd = 83 // 经验增加
PROP_CoinAdd = 84 // 金币增加
PROP_AtkPct = 4210 // 攻击百分比
PROP_HpPct = 1016 // 生命百分比
PROP_DefPct = 4213 // 防御百分比
PROP_CurHp = 10002 // 当前血量
)
// ============================================================================
// PropMap
// ============================================================================
type PropMap map[int32]float32
func UpdatePropMap(self PropMap, mods *MPB.PropMods) (updated PropMap) {
updated = make(PropMap)
for id, p := range mods.PropMods {
if !p.Dirty {
continue
}
v := (p.Base + p.Ext) * (1 + p.Pct)
self[id] += v
if self[id] == 0 {
delete(self, id)
}
updated[id] = v
p.Dirty = false
}
return
}
//计算额外的加成属性
func AddAttributeTeam(self PropMap, AttributeTeam []*MPB.AttributeType) {
t := NewPropMods()
for _, value := range AttributeTeam {
Props2other := &MPB.ClassAttributeType{ClassAttributeType: map[int32]*MPB.PropType{}}
AddProps(Props2other, value.Type, value.Id, float32(value.Val))
for _, v1 := range Props2other.ClassAttributeType {
for _, v2 := range v1.PropType {
AddPropMods(t, v2)
}
}
}
UpdatePropMap(self, t)
return
}
// ============================================================================
// PropMods
// ============================================================================
type ClassProp struct {
Prop_mods *MPB.PropMods //统计个人属性
Props2other *MPB.ClassAttributeType `bson:"-"` //自己加其他人的范围属性
Props2map *MPB.PropMods //加自己的范围属性
Prop_map PropMap //最后属性
}
// ============================================================================
func NewClassProp() *ClassProp {
return &ClassProp{NewPropMods(), &MPB.ClassAttributeType{}, NewPropMods(), make(PropMap)}
}
func NewPropMods() *MPB.PropMods {
return &MPB.PropMods{PropMods: map[int32]*MPB.PropEntryT{}}
}
func ModBase(self *MPB.PropMods, id int32, v float32) {
if v == 0 {
return
}
if id < C_prop_min_pct_id {
// normal
p := findPropMods(self, id)
p.Base += v
p.Dirty = true
} else if id < C_prop_min_aggregate_id {
// pct
id -= C_prop_pct_plus_id
p := findPropMods(self, id)
p.Pct += v
p.Dirty = true
} else {
// aggr
count := int32(((id - C_prop_min_aggregate_id) % 1000) / 100)
fromid := (id - C_prop_min_aggregate_id) - 100*count
for id = fromid; id < fromid+count; id++ {
ModBase(self, id, v)
}
}
}
func ModBasePct(self *MPB.PropMods, id int32, v float32) {
if v == 0 {
return
}
if id < C_prop_min_pct_id {
// normal
p := findPropMods(self, id)
p.Ext += p.Base * v
p.Dirty = true
} else if id < C_prop_min_aggregate_id {
Log.Warning("not support mod base pct", id)
} else {
// aggr
count := int32(((id - C_prop_min_aggregate_id) % 1000) / 100)
fromid := (id - C_prop_min_aggregate_id) - 100*count
for id = fromid; id < fromid+count; id++ {
ModBasePct(self, id, v)
}
}
}
func ModExt(self *MPB.PropMods, id int32, v float32) {
if v == 0 {
return
}
if id < C_prop_min_pct_id {
// normal
p := findPropMods(self, id)
p.Ext += v
p.Dirty = true
} else if id < C_prop_min_aggregate_id {
// pct
id -= C_prop_pct_plus_id
p := findPropMods(self, id)
p.Pct += v
p.Dirty = true
} else {
// aggr
count := int32(((id - C_prop_min_aggregate_id) % 1000) / 100)
fromid := (id - C_prop_min_aggregate_id) - 100*count
for id = fromid; id < fromid+count; id++ {
ModExt(self, id, v)
}
}
}
func AddProps(self *MPB.ClassAttributeType, Type, id int32, num float32) {
cur := self.ClassAttributeType[1]
curtype := cur.PropType[Type]
if curtype == nil {
curtype = NewPropMods()
cur.PropType[Type] = curtype
}
ModExt(curtype, id, num)
}
func AddAttributeType(self *MPB.ClassAttributeType, new *MPB.ClassAttributeType) {
for Vocation, value := range new.ClassAttributeType {
cur := self.ClassAttributeType[Vocation]
if cur == nil {
cur = &MPB.PropType{PropType: map[int32]*MPB.PropMods{}}
self.ClassAttributeType[Vocation] = cur
}
for Type, v := range value.PropType {
curtype := cur.PropType[Type]
if curtype == nil {
curtype = NewPropMods()
cur.PropType[Type] = curtype
}
AddPropMods(curtype, v)
}
}
}
func AddPropMods(self *MPB.PropMods, m *MPB.PropMods) {
for id, p2 := range m.PropMods {
if p2.Base == 0 && p2.Pct == 0 && p2.Ext == 0 {
continue
}
p1 := findPropMods(self, id)
p1.Base += p2.Base
p1.Pct += p2.Pct
p1.Ext += p2.Ext
p1.Dirty = true
}
}
func SubPropMods(self *MPB.PropMods, m *MPB.PropMods) {
for id, p2 := range m.PropMods {
if p2.Base == 0 && p2.Pct == 0 && p2.Ext == 0 {
continue
}
p1 := findPropMods(self, id)
p1.Base -= p2.Base
p1.Pct -= p2.Pct
p1.Ext -= p2.Ext
p1.Dirty = true
}
}
// ============================================================================
func findPropMods(self *MPB.PropMods, id int32) *MPB.PropEntryT {
p := self.PropMods[id]
if p == nil {
p = &MPB.PropEntryT{}
self.PropMods[id] = p
}
return p
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/liuxuezhan/mylib.git
git@gitee.com:liuxuezhan/mylib.git
liuxuezhan
mylib
mylib
v1.1.3

搜索帮助