player_recruit.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package player
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/data"
  5. "f1-game/internal/event"
  6. nameLocal "f1-game/internal/name/local"
  7. "f1-game/internal/pb"
  8. "f1-game/internal/types"
  9. "f1-game/nodes/game/player/asset"
  10. ao "f1-game/nodes/game/player/asset/origin"
  11. cproto "github.com/cherry-game/cherry/net/proto"
  12. )
  13. func (p *actorPlayer) initRecruit() {
  14. p.Local().Register(nameLocal.Player_Recruit, p.recruit)
  15. }
  16. // recruit 英雄招募
  17. func (p *actorPlayer) recruit(session *cproto.Session, req *pb.I32I32) {
  18. var (
  19. heroTable = p.HeroTable()
  20. poolID = req.Key
  21. num = req.Value
  22. )
  23. // 容量检测
  24. if heroTable.Heroes.CapacityRemain() < num {
  25. p.ResponseCode(session, code.HeroCapacityLimit)
  26. return
  27. }
  28. recruitRow, ok := data.Recruit.GetByID(poolID)
  29. if !ok {
  30. p.ResponseCode(session, code.ConfigNotFound_Recruit)
  31. return
  32. }
  33. if !recruitRow.IsRecruitEnabled() {
  34. p.ResponseCode(session, code.HeroCannotRecruit)
  35. return
  36. }
  37. // 次数检测
  38. costNum := recruitRow.GetCostNum(num)
  39. if costNum <= 0 {
  40. p.ResponseCode(session, code.HeroCannotRecruit)
  41. return
  42. }
  43. //TODO 免费次数逻辑
  44. //判断消耗资产
  45. errCode := asset.Service().Enough(p.playerID, recruitRow.CostItemID, int64(costNum))
  46. if code.IsFail(errCode) {
  47. p.ResponseCode(session, errCode)
  48. return
  49. }
  50. var (
  51. addAssets types.Assets
  52. recruitNum = heroTable.Recruit.Total[poolID]
  53. )
  54. //招募
  55. for i := int32(0); i < num; i++ {
  56. recruitNum++
  57. curRecruitPool := recruitRow.GetRecruitPool(recruitNum)
  58. row, errCode := data.DropPool.RandomOne(curRecruitPool)
  59. if code.IsFail(errCode) {
  60. p.ResponseCode(session, errCode)
  61. return
  62. }
  63. addAssets.Add(row.ItemID, row.Num)
  64. p.Debug("[recruit] hero pool. recruitPool=%d, num = %d", curRecruitPool, recruitNum)
  65. }
  66. //TODO 判断扣除免费次数还是者消耗材料
  67. //扣除招募消耗
  68. asset.Service().Sub(p.playerID, recruitRow.CostItemID, int64(costNum), ao.RecruitCost)
  69. // 添加资产
  70. retAssets, errCode := asset.Service().Adds(p.playerID, addAssets, ao.RecruitReward, true)
  71. if code.IsFail(errCode) {
  72. p.Warn("[recruit] error. [req = %+v, errCode = %d]", req, errCode)
  73. }
  74. heroTable.Recruit.Total[poolID] = recruitNum
  75. heroTable.Save2Queue()
  76. // 事件
  77. e := event.NewHeroRecruit(p.playerID, recruitNum)
  78. p.PostEvent(e)
  79. // 返回招募结果
  80. proto := heroTable.Recruit.ToProto()
  81. rsp := &pb.RecruitResponse{
  82. Rewards: retAssets.ToProto(),
  83. Recruit: &proto,
  84. }
  85. p.Response(session, rsp)
  86. }