player_minigame.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package player
  2. import (
  3. "f1-game/internal/code"
  4. "f1-game/internal/data"
  5. nameLocal "f1-game/internal/name/local"
  6. "f1-game/internal/pb"
  7. "f1-game/nodes/game/player/asset"
  8. ao "f1-game/nodes/game/player/asset/origin"
  9. cproto "github.com/cherry-game/cherry/net/proto"
  10. )
  11. func (p *actorPlayer) initMiniGame() {
  12. p.Local().Register(nameLocal.Player_MiniGameProgress, p.miniGameProgress)
  13. p.Local().Register(nameLocal.Player_MiniGameSettle, p.miniGameSettle)
  14. }
  15. // 获取小游戏进度
  16. func (p *actorPlayer) miniGameProgress(session *cproto.Session, req *pb.I32) {
  17. playerTable := p.PlayerTable()
  18. if _, found := data.MiniGame.GetByGameIDLevelID(req.Value, 1); !found {
  19. p.ResponseCode(session, code.ConfigNotFound_MiniGameLevel)
  20. return
  21. }
  22. if playerTable.MiniGame.GameID != 0 && playerTable.MiniGame.GameID != req.Value {
  23. p.ResponseCode(session, code.MiniGameGameIDError)
  24. return
  25. }
  26. rsp := &pb.I32{
  27. Value: playerTable.MiniGame.LevelId,
  28. }
  29. p.Response(session, rsp)
  30. }
  31. // 小游戏结算
  32. func (p *actorPlayer) miniGameSettle(session *cproto.Session, req *pb.I64I64I32) {
  33. var (
  34. playerTable = p.PlayerTable()
  35. chapterTable = p.ChapterTable()
  36. )
  37. // 失败不用做任何处理
  38. if req.Key3 == 0 {
  39. rsp := &pb.MiniGameSettle{
  40. LevelID: playerTable.MiniGame.LevelId,
  41. }
  42. p.Response(session, rsp)
  43. }
  44. if playerTable.MiniGame.GameID != 0 && playerTable.MiniGame.GameID != int32(req.Key1) {
  45. p.ResponseCode(session, code.MiniGameGameIDError)
  46. return
  47. }
  48. if playerTable.MiniGame.LevelId == 0 {
  49. // 第一关
  50. if int32(req.Key2) != 1 {
  51. p.ResponseCode(session, code.MiniGameLevelIDError)
  52. return
  53. }
  54. } else {
  55. currLevelRow, found := data.MiniGame.GetByGameIDLevelID(int32(req.Key1), playerTable.MiniGame.LevelId)
  56. if !found {
  57. p.ResponseCode(session, code.ConfigNotFound_MiniGameLevel)
  58. return
  59. }
  60. // 已通关所有关卡
  61. if currLevelRow.NextLevelID == 0 {
  62. p.ResponseCode(session, code.MiniGameLevelCleared)
  63. return
  64. }
  65. // 关卡id错误
  66. if currLevelRow.NextLevelID != int32(req.Key2) {
  67. p.ResponseCode(session, code.MiniGameLevelIDError)
  68. return
  69. }
  70. }
  71. nextLevelRow, found := data.MiniGame.GetByGameIDLevelID(int32(req.Key1), int32(req.Key2))
  72. if !found {
  73. p.ResponseCode(session, code.ConfigNotFound_MiniGameLevel)
  74. return
  75. }
  76. // 探险解锁关卡前置条件
  77. if !chapterTable.Chapter.IsLevelUnlocked(nextLevelRow.ChapterUnlockLevelID) {
  78. p.ResponseCode(session, code.MiniGameChapterUnLock)
  79. return
  80. }
  81. playerTable.MiniGame.GameID = int32(req.Key1)
  82. playerTable.MiniGame.LevelId = int32(req.Key2)
  83. playerTable.Save2Queue()
  84. rsp := &pb.MiniGameSettle{
  85. LevelID: playerTable.MiniGame.LevelId,
  86. }
  87. if !nextLevelRow.Reward.IsEmpty() {
  88. _, errCode := asset.Service().Adds(p.playerID, nextLevelRow.Reward, ao.MiniGameReward, false)
  89. if code.IsFail(errCode) {
  90. p.ResponseCode(session, errCode)
  91. return
  92. }
  93. assertListProto := nextLevelRow.Reward.ToAssetListProto()
  94. rsp.Rewards = &assertListProto
  95. }
  96. p.Response(session, rsp)
  97. }