package facility import ( "f1-game/internal/constant" "f1-game/internal/data" "f1-game/internal/enum" "f1-game/internal/extend/math" "f1-game/internal/types" "f1-game/nodes/map/internal/db" ) type ( attrs types.Attrs // 万分比属性 key:attrKey, value:attrValue attrFn func(playerID int64, attrs attrs) ) var attrKeyMap = map[int32]int32{ enum.AttrGrainYield: enum.AttrGrainYieldRatio, enum.AttrStoneYield: enum.AttrStoneYieldRatio, enum.AttrWoodYield: enum.AttrWoodYieldRatio, enum.AttrIronYield: enum.AttrIronYieldRatio, } func newAttrs() attrs { return attrs{} } func (p attrs) result() types.Attrs { attrMap := types.NewAttrs() for key, value := range p { // 有对应的万分比属性 if ratioKey, ok := attrKeyMap[key]; ok { attrMap.Add(key, p.mulRatio(value, ratioKey)) } attrMap.Add(key, value) } return attrMap } func (p attrs) mulRatio(value int64, ratioKey int32) int64 { return math.Round[float64, int64](float64(value*p[ratioKey]) / constant.RatioBase) } var attrFnList = []attrFn{ initFn, facilityFn, } // initFn 初始属性 func initFn(_ int64, attrs attrs) { attrs[enum.AttrIronYield] += data.Const.ItemInitIronYield attrs[enum.AttrStoneYield] += data.Const.ItemInitStoneYield attrs[enum.AttrGrainYield] += data.Const.ItemInitGrainYield attrs[enum.AttrWoodYield] += data.Const.ItemInitWoodYield attrs[enum.AttrResCapacity] += data.Const.ItemInitResCapacity } // facilityFn 城建属性 func facilityFn(playerID int64, attrs attrs) { playerTable := db.GetMapPlayerTable(playerID) if playerTable == nil { return } // 获取城建对应等级的属性 for _, facility := range playerTable.Facilities.Facilitys { if levelRow, ok := data.FacilityLevel.GetByFacilityIDLevel(facility.FacilityID, facility.Level); ok { for k, v := range levelRow.Attrs { attrs[k] += v } } } }