role_draw.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. package model
  2. import (
  3. "rocommon/service"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. "roserver/serverproto"
  7. )
  8. const (
  9. DrawType_Card = 1
  10. DrawType_Pet = 2
  11. DrawType_SkillEquip = 3
  12. DrawType_EggsGold = 4 // 金蛋
  13. DrawType_EggsSpecial = 5 // 彩蛋
  14. DrawPetEnableLimitNum = 400
  15. DrawCardEnableLimitNum = 400
  16. DrawSkillEquipEnableLimitNum = 400
  17. )
  18. const (
  19. Draw_Count_One = 1
  20. Draw_Count_Five = 5
  21. Draw_Count_Ten = 10
  22. )
  23. type RoleDraw struct {
  24. SaveObject
  25. DrawSystem map[int32]*serverproto.DrawData
  26. totalCardDrawNum int32
  27. totalPetDrawNum int32
  28. totalSkillEquipDrawNum int32
  29. }
  30. func newRoleDraw(r *Role) *RoleDraw {
  31. roleCommon := &RoleDraw{
  32. SaveObject: SaveObject{
  33. role: r,
  34. },
  35. }
  36. roleCommon.DrawSystem = map[int32]*serverproto.DrawData{}
  37. return roleCommon
  38. }
  39. func (this *RoleDraw) Load(msg interface{}) bool {
  40. proRole := msg.(*serverproto.Role)
  41. if proRole != nil && proRole.RoleDraw != nil {
  42. for _, data := range proRole.RoleDraw.DrawSystem {
  43. this.DrawSystem[data.DrawType] = data
  44. }
  45. this.totalPetDrawNum = proRole.RoleDraw.PetDrawTotalNum
  46. this.totalCardDrawNum = proRole.RoleDraw.CardDrawTotalNum
  47. this.totalSkillEquipDrawNum = proRole.RoleDraw.SkillEquipDrawTotalNum
  48. }
  49. return true
  50. }
  51. func (this *RoleDraw) Save() {
  52. this.SetDirty(false)
  53. util.DebugF("uid=%v RoleDraw save...", this.role.GetUUid())
  54. saveMsg := &serverproto.SSRoleDrawDataSaveReq{
  55. RoleDraw: &serverproto.RoleDraw{
  56. PetDrawTotalNum: this.totalPetDrawNum,
  57. CardDrawTotalNum: this.totalCardDrawNum,
  58. SkillEquipDrawTotalNum: this.totalSkillEquipDrawNum,
  59. },
  60. }
  61. for _, data := range this.DrawSystem {
  62. saveMsg.RoleDraw.DrawSystem = append(saveMsg.RoleDraw.DrawSystem, data)
  63. }
  64. this.role.SendDb(saveMsg)
  65. }
  66. func (this *RoleDraw) CopyData(draw *serverproto.RoleDraw) {
  67. for _, data := range this.DrawSystem {
  68. draw.DrawSystem = append(draw.DrawSystem, data)
  69. }
  70. }
  71. func (this *RoleDraw) CheckIsNew(drawType int32, itemId int32) bool {
  72. if drawType == DrawType_Card {
  73. return this.role.GetRoleCard().CheckNewCard(itemId)
  74. } else if drawType == DrawType_Pet {
  75. return this.role.GetRolePet().CheckNewPet(itemId)
  76. }
  77. return false
  78. }
  79. func (this *RoleDraw) GetDrawItem(drawType *model.SummonCostByServerTime, isUseGold bool, addItemList map[int32]int32, ackMsg *serverproto.SCDrawCardAck) int32 {
  80. resType := model.Draw_ResType_Item
  81. if isUseGold == true {
  82. resType = model.Draw_ResType_Gold
  83. }
  84. //调用接口。找到一个随机Item
  85. drawTemplate := model.GetDrawProbItem(drawType.Id, int32(resType))
  86. if drawTemplate == nil {
  87. return 0
  88. }
  89. //根据Item随机道具
  90. ntfItemList := map[int32]*serverproto.KeyValueType{}
  91. var index int32 = 0
  92. for _, data := range drawTemplate.DrawItem {
  93. itemList := map[int32]int32{}
  94. for i := 0; i < int(data.Key); i++ {
  95. this.role.GetRoleBattle().DropProcess(itemList, int32(data.Value))
  96. for key, value := range itemList {
  97. addItemList[key] += value
  98. index++
  99. ntfItemList[index] = &serverproto.KeyValueType{
  100. Key: key,
  101. Value: value,
  102. }
  103. }
  104. itemList = make(map[int32]int32)
  105. }
  106. }
  107. for _, data := range ntfItemList {
  108. ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.DrawItem{
  109. ItemId: data.Key,
  110. ItemNum: data.Value,
  111. IsNew: this.CheckIsNew(drawType.SummonType, data.Key),
  112. })
  113. }
  114. //选择的概率ID
  115. util.InfoF("uid=%v RoleDraw draw configId=%v drawType=%v, resType=%v", this.role.GetUUid(), drawTemplate.ConfigId, drawType, resType)
  116. return drawTemplate.ExtraPoint
  117. }
  118. func (this *RoleDraw) DrawReq(drawType int32, drawCount int32, ackMsg *serverproto.SCDrawCardAck) serverproto.ErrorCode {
  119. //判定配置
  120. ////drawCfg, ok := serverproto.SummonCfgLoader[drawType]
  121. //if !ok {
  122. // return serverproto.ErrorCode_ERROR_DRAWSYSTEM_CONFIG_NOT_FOUND
  123. //}
  124. costData, ok2 := model.ConvertSummonList[drawType]
  125. if !ok2 {
  126. return serverproto.ErrorCode_ERROR_DRAWSYSTEM_CONFIG_NOT_FOUND
  127. }
  128. //判定是否存在抽取次数
  129. _, ok3 := costData.DrawCount[drawCount]
  130. if !ok3 {
  131. return serverproto.ErrorCode_ERROR_DRAWSYSTEM_DRAW_COUNT
  132. }
  133. //1.检查道具是否足够,检查方式:优先用道具,道具不够金币补足,金币不够拉倒
  134. var itemNum int32 = 0
  135. var goldNum int32 = 0
  136. isUseGold := false
  137. curItemNum := uint32(this.role.GetResNum(costData.ItemId))
  138. if costData.ItemId > 0 && curItemNum >= uint32(costData.ItemNum*drawCount) {
  139. itemNum = costData.ItemNum * drawCount
  140. } else {
  141. itemNum = int32(curItemNum)
  142. goldNum = (drawCount - itemNum) * costData.SourceNum
  143. curSourceNum := this.role.GetRmb()
  144. if curSourceNum < uint32(goldNum) || goldNum <= 0 {
  145. return serverproto.ErrorCode_ERROR_DRAWSYSTEM_RES_NOT_ENOUGH
  146. }
  147. isUseGold = true
  148. }
  149. if checkCode := this.CheckDrawEnable(costData.SummonType); checkCode != serverproto.ErrorCode_ERROR_OK {
  150. return checkCode
  151. }
  152. //根据开服天数获取召唤数据(活动召唤无效)
  153. startUpTime := service.GetServiceStartupTime()
  154. curDiffDay := util.GetDurationDay2(startUpTime, util.GetTimeMilliseconds())
  155. drawCfg := costData.GetDataByDiffDay(curDiffDay)
  156. if drawCfg == nil {
  157. return serverproto.ErrorCode_ERROR_DRAWSYSTEM_CONFIG_NOT_FOUND
  158. }
  159. totalItemList := make(map[int32]int32)
  160. extraPoint := int32(Draw_Count_One)
  161. if drawCount == Draw_Count_One {
  162. if isUseGold == true {
  163. this.role.GetRoleBattle().DropProcess(totalItemList, int32(drawCfg.DropId2))
  164. } else {
  165. this.role.GetRoleBattle().DropProcess(totalItemList, int32(drawCfg.DropId))
  166. }
  167. if len(totalItemList) > 0 {
  168. for key, num := range totalItemList {
  169. ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.DrawItem{
  170. ItemId: int32(key),
  171. ItemNum: int32(num),
  172. IsNew: this.CheckIsNew(drawType, key),
  173. })
  174. }
  175. }
  176. } else if drawCount == Draw_Count_Five || drawCount == Draw_Count_Ten {
  177. extraPoint = this.GetDrawItem(drawCfg, isUseGold, totalItemList, ackMsg)
  178. }
  179. if len(totalItemList) <= 0 {
  180. return serverproto.ErrorCode_ERROR_DRAWSYSTEM_CONFIG_NOT_FOUND
  181. }
  182. //累积抽取次数
  183. _, ok1 := this.DrawSystem[drawType]
  184. if !ok1 {
  185. this.DrawSystem[drawType] = &serverproto.DrawData{
  186. DrawType: drawType,
  187. DrawTimes: extraPoint,
  188. }
  189. } else {
  190. this.DrawSystem[drawType].DrawTimes += extraPoint
  191. }
  192. //如果次数>=配置次数,给累计奖励
  193. var bSuperUnlockRechargeDropId int32 = 0
  194. if this.DrawSystem[drawType].DrawTimes >= costData.Total {
  195. var exItemList = map[int32]int32{}
  196. this.role.GetRoleBattle().DropProcess(exItemList, int32(drawCfg.ExtDropId))
  197. if len(exItemList) > 0 {
  198. for key, value := range exItemList {
  199. if key > 0 && value > 0 {
  200. ackMsg.ExtraItem = append(ackMsg.ExtraItem, &serverproto.DrawItem{
  201. ItemId: key,
  202. ItemNum: value,
  203. IsNew: this.CheckIsNew(drawType, key),
  204. })
  205. totalItemList[key] += value
  206. }
  207. }
  208. }
  209. //扣除一次累计奖励需要的累计次数
  210. this.DrawSystem[drawType].DrawTimes -= costData.Total
  211. bSuperUnlockRechargeDropId = drawCfg.ExtDropId
  212. }
  213. bRet := this.role.GetRoleBag().CanAddItemList(totalItemList)
  214. if bRet == serverproto.ErrorCode_ERROR_OK {
  215. //先扣除消耗
  216. removeItemList := make(map[int32]int32)
  217. if itemNum > 0 {
  218. removeItemList[costData.ItemId] = itemNum
  219. }
  220. if goldNum > 0 {
  221. removeItemList[costData.SourceId] = goldNum
  222. }
  223. if drawType == DrawType_Card {
  224. this.role.GetRoleBag().DelItemList(removeItemList, AddItemST{AddFrom: AddFrom_DrawCard})
  225. //添加卡片
  226. this.role.AddItemList(totalItemList, AddFrom_DrawCard, true)
  227. this.totalCardDrawNum += drawCount
  228. TaskMagCheck(this.role, serverproto.TaskType_Draw_Card_Num, 0)
  229. TaskMagCheck(this.role, serverproto.TaskType_Eve_Card_Num, drawCount)
  230. if bSuperUnlockRechargeDropId > 0 {
  231. this.role.roleActivity.SuperChargeUnlockCheck(serverproto.UnlockChargeType_UChargeType_DrawCardSpecial,
  232. &SuperChargeUnlockST{oldValue: bSuperUnlockRechargeDropId})
  233. }
  234. } else if drawType == DrawType_Pet {
  235. this.role.GetRoleBag().DelItemList(removeItemList, AddItemST{AddFrom: AddFrom_DrawPet})
  236. //添加卡片
  237. this.role.AddItemList(totalItemList, AddFrom_DrawPet, true)
  238. this.totalPetDrawNum += drawCount
  239. TaskMagCheck(this.role, serverproto.TaskType_Draw_Pet_Num, 0)
  240. TaskMagCheck(this.role, serverproto.TaskType_Eve_Pet_Num, drawCount)
  241. if bSuperUnlockRechargeDropId > 0 {
  242. this.role.roleActivity.SuperChargeUnlockCheck(serverproto.UnlockChargeType_UChargeType_DrawPetSpecial,
  243. &SuperChargeUnlockST{oldValue: bSuperUnlockRechargeDropId})
  244. }
  245. } else if drawType == DrawType_SkillEquip {
  246. this.role.GetRoleBag().DelItemList(removeItemList, AddItemST{AddFrom: AddFrom_DrawSkillEquip})
  247. this.role.AddItemList(totalItemList, AddFrom_DrawSkillEquip, true)
  248. this.totalSkillEquipDrawNum += drawCount
  249. //TaskMagCheck(this.role, serverproto.TaskType_Draw_Pet_Num, 0)
  250. //this.role.GetRoleActivity().TaskCheck(serverproto.TaskType_Eve_Pet_Num, drawCount)
  251. if bSuperUnlockRechargeDropId > 0 {
  252. this.role.roleActivity.SuperChargeUnlockCheck(serverproto.UnlockChargeType_UChargeType_DrawSkillEquipSpecial,
  253. &SuperChargeUnlockST{oldValue: bSuperUnlockRechargeDropId})
  254. }
  255. } else {
  256. //活动召唤
  257. if costData.ActivitiesId > 0 {
  258. this.role.GetRoleBag().DelItemList(removeItemList, AddItemST{AddFrom: AddFrom_ActivitySummon})
  259. if costData.SummonType == DrawType_EggsGold {
  260. this.role.AddItemList(totalItemList, AddFrom_ActivitySmashEggs, true)
  261. } else if costData.SummonType == DrawType_EggsSpecial {
  262. this.role.AddItemList(totalItemList, AddFrom_ActivitySmashEggsSpeical, true)
  263. } else {
  264. this.role.AddItemList(totalItemList, AddFrom_ActivitySummon, true)
  265. }
  266. //召唤类型
  267. switch costData.SummonType {
  268. case DrawType_Card:
  269. this.totalCardDrawNum += drawCount
  270. TaskMagCheck(this.role, serverproto.TaskType_Draw_Card_Num, 0)
  271. TaskMagCheck(this.role, serverproto.TaskType_Eve_Card_Num, drawCount)
  272. case DrawType_Pet:
  273. this.totalPetDrawNum += drawCount
  274. TaskMagCheck(this.role, serverproto.TaskType_Draw_Pet_Num, 0)
  275. TaskMagCheck(this.role, serverproto.TaskType_Eve_Pet_Num, drawCount)
  276. case DrawType_SkillEquip:
  277. }
  278. }
  279. }
  280. this.OnDrawEnd(drawType, totalItemList)
  281. } else {
  282. //如果道具没有加进去。则扣除
  283. this.DrawSystem[drawType].DrawTimes -= drawCount
  284. ackMsg.ItemList = append(ackMsg.ItemList[0:0])
  285. ackMsg.ExtraItem = append(ackMsg.ExtraItem[0:0])
  286. if bRet == serverproto.ErrorCode_ERROR_BAG_FULL {
  287. if drawType == DrawType_Card {
  288. return serverproto.ErrorCode_ERROR_DRAWSYSTEM_CARD_BAG_FULL
  289. } else if drawType == DrawType_Pet {
  290. return serverproto.ErrorCode_ERROR_DRAWSYSTEM_PET_BAG_FULL
  291. }
  292. } else {
  293. return bRet
  294. }
  295. }
  296. ackMsg.AddPoint = extraPoint
  297. ackMsg.DrawCount = drawCount
  298. ackMsg.DrawTimes = this.DrawSystem[drawType].DrawTimes
  299. this.SetDirty(true)
  300. return serverproto.ErrorCode_ERROR_OK
  301. }
  302. func (this *RoleDraw) OnDrawEnd(drawType int32, rewardList map[int32]int32) {
  303. if drawType == DrawType_Card {
  304. for key, _ := range rewardList {
  305. itemCfg, ok := serverproto.ItemCfgLoader[key]
  306. if !ok {
  307. continue
  308. }
  309. if itemCfg.ResType == int32(serverproto.ResType_Res_Card) {
  310. cardCfg, ok2 := serverproto.CardCfgLoader[key]
  311. if !ok2 {
  312. continue
  313. }
  314. if cardCfg.CardType == model.Card_Type_MVP {
  315. this.role.GetRoleActivity().SuperChargeUnlockCheck(
  316. serverproto.UnlockChargeType_UChargeType_DrawCardMVP, &SuperChargeUnlockST{oldValue: key})
  317. }
  318. }
  319. }
  320. this.role.GetRoleActivity().SuperChargeUnlockCheck(
  321. serverproto.UnlockChargeType_UChargeType_DrawCardQualityNum, &SuperChargeUnlockST{rewardCardList: rewardList})
  322. } else if drawType == DrawType_Pet {
  323. for key, _ := range rewardList {
  324. itemCfg, ok := serverproto.ItemCfgLoader[key]
  325. if !ok {
  326. continue
  327. }
  328. if itemCfg.ResType == int32(serverproto.ResType_Res_Pet) {
  329. cardCfg, ok2 := serverproto.PetCfgLoader[key]
  330. if !ok2 {
  331. continue
  332. }
  333. if cardCfg.Quality == model.Card_Type_MVP {
  334. this.role.GetRoleActivity().SuperChargeUnlockCheck(
  335. serverproto.UnlockChargeType_UChargeType_DrawPetMVP, &SuperChargeUnlockST{oldValue: key})
  336. }
  337. }
  338. }
  339. } else {
  340. for key, _ := range rewardList {
  341. itemCfg, ok := serverproto.ItemCfgLoader[key]
  342. if !ok {
  343. continue
  344. }
  345. if itemCfg.ResType == int32(serverproto.ResType_Res_Pet) {
  346. cardCfg, ok2 := serverproto.PetCfgLoader[key]
  347. if !ok2 {
  348. continue
  349. }
  350. if cardCfg.Quality == model.Card_Type_MVP {
  351. this.role.GetRoleActivity().SuperChargeUnlockCheck(
  352. serverproto.UnlockChargeType_UChargeType_DrawPetMVP, &SuperChargeUnlockST{oldValue: key})
  353. }
  354. } else if itemCfg.ResType == int32(serverproto.ResType_Res_Card) {
  355. cardCfg, ok2 := serverproto.CardCfgLoader[key]
  356. if !ok2 {
  357. continue
  358. }
  359. if cardCfg.CardType == model.Card_Type_MVP {
  360. this.role.GetRoleActivity().SuperChargeUnlockCheck(
  361. serverproto.UnlockChargeType_UChargeType_DrawCardMVP, &SuperChargeUnlockST{oldValue: key})
  362. }
  363. }
  364. }
  365. }
  366. }
  367. func (this *RoleDraw) GetDrawCardNum() int32 {
  368. return this.totalCardDrawNum
  369. }
  370. func (this *RoleDraw) GetDrawPetNum() int32 {
  371. return this.totalPetDrawNum
  372. }
  373. //召唤限制,背包最大数量超过上限(格子数量)时,需要减少数量,否则不允许进行召唤操作,
  374. func (this *RoleDraw) CheckDrawEnable(drawType int32) serverproto.ErrorCode {
  375. switch drawType {
  376. case DrawType_Pet:
  377. if this.role.GetRolePet().GetPetePileTotalNum() >= DrawPetEnableLimitNum {
  378. return serverproto.ErrorCode_ERROR_DAWSYSTEM_PET_FULL
  379. }
  380. case DrawType_Card:
  381. if this.role.GetRoleCard().GetCardPileTotalNum() >= DrawCardEnableLimitNum {
  382. return serverproto.ErrorCode_ERROR_DAWSYSTEM_CARD_FULL
  383. }
  384. case DrawType_SkillEquip:
  385. if this.role.GetRoleSkillEquip().GetSkillEquipPileTotalNum() >= DrawSkillEquipEnableLimitNum {
  386. return serverproto.ErrorCode_ERROR_DAWSYSTEM_SKILLEQUIP_FULL
  387. }
  388. }
  389. return serverproto.ErrorCode_ERROR_OK
  390. }