attrs.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package facility
  2. import (
  3. "f1-game/internal/constant"
  4. "f1-game/internal/data"
  5. "f1-game/internal/enum"
  6. "f1-game/internal/extend/math"
  7. "f1-game/internal/types"
  8. "f1-game/nodes/map/internal/db"
  9. )
  10. type (
  11. attrs types.Attrs // 万分比属性 key:attrKey, value:attrValue
  12. attrFn func(playerID int64, attrs attrs)
  13. )
  14. var attrKeyMap = map[int32]int32{
  15. enum.AttrGrainYield: enum.AttrGrainYieldRatio,
  16. enum.AttrStoneYield: enum.AttrStoneYieldRatio,
  17. enum.AttrWoodYield: enum.AttrWoodYieldRatio,
  18. enum.AttrIronYield: enum.AttrIronYieldRatio,
  19. }
  20. func newAttrs() attrs {
  21. return attrs{}
  22. }
  23. func (p attrs) result() types.Attrs {
  24. attrMap := types.NewAttrs()
  25. for key, value := range p {
  26. // 有对应的万分比属性
  27. if ratioKey, ok := attrKeyMap[key]; ok {
  28. attrMap.Add(key, p.mulRatio(value, ratioKey))
  29. }
  30. attrMap.Add(key, value)
  31. }
  32. return attrMap
  33. }
  34. func (p attrs) mulRatio(value int64, ratioKey int32) int64 {
  35. return math.Round[float64, int64](float64(value*p[ratioKey]) / constant.RatioBase)
  36. }
  37. var attrFnList = []attrFn{
  38. initFn,
  39. facilityFn,
  40. }
  41. // initFn 初始属性
  42. func initFn(_ int64, attrs attrs) {
  43. attrs[enum.AttrIronYield] += data.Const.ItemInitIronYield
  44. attrs[enum.AttrStoneYield] += data.Const.ItemInitStoneYield
  45. attrs[enum.AttrGrainYield] += data.Const.ItemInitGrainYield
  46. attrs[enum.AttrWoodYield] += data.Const.ItemInitWoodYield
  47. attrs[enum.AttrResCapacity] += data.Const.ItemInitResCapacity
  48. }
  49. // facilityFn 城建属性
  50. func facilityFn(playerID int64, attrs attrs) {
  51. playerTable := db.GetMapPlayerTable(playerID)
  52. if playerTable == nil {
  53. return
  54. }
  55. // 获取城建对应等级的属性
  56. for _, facility := range playerTable.Facilities.Facilitys {
  57. if levelRow, ok := data.FacilityLevel.GetByFacilityIDLevel(facility.FacilityID, facility.Level); ok {
  58. for k, v := range levelRow.Attrs {
  59. attrs[k] += v
  60. }
  61. }
  62. }
  63. }