package equipment import ( "crypto/rand" "go_dreamfactory/comm" "go_dreamfactory/lego/sys/log" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" "math/big" "go.mongodb.org/mongo-driver/bson/primitive" ) //参数校验 func (this *Api_Comp) Upgrade_Check(session comm.IUserSession, req *pb.Equipment_Upgrade_Req) (result map[string]interface{}, code comm.ErrorCode) { var ( err error conf *cfg.Game_equipmentData equipment *pb.DB_Equipment ) if req.EquipmentId == "" { log.Errorf("Upgrade 请求参数错误 req:%v", req) code.Code = pb.ErrorCode_ReqParameterError return } if equipment, err = this.module.model_equipment_comp.Equipment_QueryUserEquipmentsPackById(session.GetUserId(), req.EquipmentId); err != nil { log.Errorf("Equip_Check err:%v", err) code.Code = pb.ErrorCode_EquipmentOnFoundEquipment return } if conf, err = this.module.configure_comp.GetEquipmentConfigureById(equipment.CId); err != nil { log.Errorf("Equip_Check err:%v", err) code.Code = pb.ErrorCode_EquipmentOnFoundEquipment return } if equipment.Lv >= conf.MaxLv { log.Errorf("Equip_Check Lv:%v MaxLv:%v", equipment.Lv, conf.MaxLv) code.Code = pb.ErrorCode_EquipmentLvlimitReached } result = map[string]interface{}{ "equipment": equipment, "conf": conf, } return } ///英雄挂在装备 func (this *Api_Comp) Upgrade(session comm.IUserSession, agrs map[string]interface{}, req *pb.Equipment_Upgrade_Req) (code pb.ErrorCode) { var ( err error conf *cfg.Game_equipmentData equipment *pb.DB_Equipment hero *pb.DB_HeroData equipments []*pb.DB_Equipment probability int32 guaranteed int32 issucc bool ) defer func() { if code == pb.ErrorCode_Success { session.SendMsg(string(this.module.GetType()), "", &pb.Equipment_Upgrade_Resp{}) } }() conf = agrs["conf"].(*cfg.Game_equipmentData) equipment = agrs["equipment"].(*pb.DB_Equipment) probability = conf.UpgradeProbability[equipment.Lv] guaranteed = conf.UpgradeGuaranteed[equipment.Lv] if equipment.KeepFailNum >= guaranteed { //没有达到保底次数 根据概率随机成功失败 issucc = true } else { //随机 n, _ := rand.Int(rand.Reader, big.NewInt(100)) if int32(n.Int64()) < probability { issucc = true } else { issucc = false } } if issucc { //没有佩戴的装备 if equipment.IsInitialState && equipment.OverlayNum > 1 { // 叠加装备 拆分处理 equipment.OverlayNum-- if err = this.module.model_equipment_comp.ChangeList(session.GetUserId(), equipment.Id, map[string]interface{}{ "overlayNum": equipment.OverlayNum, "heroId": "", }); err != nil { log.Errorf("Upgrade err:%v", err) code = pb.ErrorCode_SystemError return } equipment = CloneEquipment(equipment) equipment.Id = primitive.NewObjectID().Hex() equipment.IsInitialState = false equipment.OverlayNum = 1 equipment.Lv++ if err = this.module.model_equipment_comp.AddList(session.GetUserId(), equipment.Id, equipment); err != nil { log.Errorf("Upgrade err:%v", err) code = pb.ErrorCode_SystemError return } } else { equipment.IsInitialState = false equipment.Lv++ if err = this.module.model_equipment_comp.ChangeList(session.GetUserId(), equipment.Id, map[string]interface{}{"lv": equipment.Lv}); err != nil { log.Errorf("Upgrade err:%v", err) code = pb.ErrorCode_SystemError return } } if equipment.HeroId != "" { //已装备 重新计算属性 if hero, code = this.module.hero.GetHero(equipment.HeroId); code != pb.ErrorCode_Success { log.Errorf("Upgrade code:%d", code) return } hero.EquipID[conf.Station] = equipment.Id //拆分后的装备是一个新的 for i, v := range hero.EquipID { if v != "" { if v != equipment.Id { if equipments[i], err = this.module.model_equipment_comp.Equipment_QueryUserEquipmentsPackById(session.GetUserId(), v); err != nil { log.Errorf("Upgrade err:%v", err) code = pb.ErrorCode_EquipmentOnFoundEquipment return } } else { equipments[i] = equipment } } } equipment.Lv++ if err = this.module.model_equipment_comp.ChangeList(session.GetUserId(), equipment.Id, map[string]interface{}{"lv": equipment.Lv}); err != nil { log.Errorf("Upgrade err:%v", err) code = pb.ErrorCode_SystemError return } code = this.module.hero.UpdateEquipment(hero, equipments) } } return }