| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- package player
- import (
- "f1-game/internal/code"
- "f1-game/internal/data"
- "f1-game/internal/event"
- nameLocal "f1-game/internal/name/local"
- "f1-game/internal/pb"
- "f1-game/internal/types"
- "f1-game/nodes/game/player/asset"
- ao "f1-game/nodes/game/player/asset/origin"
- cproto "github.com/cherry-game/cherry/net/proto"
- )
- func (p *actorPlayer) initRecruit() {
- p.Local().Register(nameLocal.Player_Recruit, p.recruit)
- }
- // recruit 英雄招募
- func (p *actorPlayer) recruit(session *cproto.Session, req *pb.I32I32) {
- var (
- heroTable = p.HeroTable()
- poolID = req.Key
- num = req.Value
- )
- // 容量检测
- if heroTable.Heroes.CapacityRemain() < num {
- p.ResponseCode(session, code.HeroCapacityLimit)
- return
- }
- recruitRow, ok := data.Recruit.GetByID(poolID)
- if !ok {
- p.ResponseCode(session, code.ConfigNotFound_Recruit)
- return
- }
- if !recruitRow.IsRecruitEnabled() {
- p.ResponseCode(session, code.HeroCannotRecruit)
- return
- }
- // 次数检测
- costNum := recruitRow.GetCostNum(num)
- if costNum <= 0 {
- p.ResponseCode(session, code.HeroCannotRecruit)
- return
- }
- //TODO 免费次数逻辑
- //判断消耗资产
- errCode := asset.Service().Enough(p.playerID, recruitRow.CostItemID, int64(costNum))
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- var (
- addAssets types.Assets
- recruitNum = heroTable.Recruit.Total[poolID]
- )
- //招募
- for i := int32(0); i < num; i++ {
- recruitNum++
- curRecruitPool := recruitRow.GetRecruitPool(recruitNum)
- row, errCode := data.DropPool.RandomOne(curRecruitPool)
- if code.IsFail(errCode) {
- p.ResponseCode(session, errCode)
- return
- }
- addAssets.Add(row.ItemID, row.Num)
- p.Debug("[recruit] hero pool. recruitPool=%d, num = %d", curRecruitPool, recruitNum)
- }
- //TODO 判断扣除免费次数还是者消耗材料
- //扣除招募消耗
- asset.Service().Sub(p.playerID, recruitRow.CostItemID, int64(costNum), ao.RecruitCost)
- // 添加资产
- retAssets, errCode := asset.Service().Adds(p.playerID, addAssets, ao.RecruitReward, true)
- if code.IsFail(errCode) {
- p.Warn("[recruit] error. [req = %+v, errCode = %d]", req, errCode)
- }
- heroTable.Recruit.Total[poolID] = recruitNum
- heroTable.Save2Queue()
- // 事件
- e := event.NewHeroRecruit(p.playerID, recruitNum)
- p.PostEvent(e)
- // 返回招募结果
- proto := heroTable.Recruit.ToProto()
- rsp := &pb.RecruitResponse{
- Rewards: retAssets.ToProto(),
- Recruit: &proto,
- }
- p.Response(session, rsp)
- }
|