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) }