go_dreamfactory/modules/equipment/api_upgrade.go

297 lines
9.9 KiB
Go

package equipment
import (
"crypto/rand"
"fmt"
"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 *apiComp) UpgradeCheck(session comm.IUserSession, req *pb.EquipmentUpgradeReq) (errdata *pb.ErrorData) {
if req.EquipmentId == "" {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ReqParameterError,
Title: pb.ErrorCode_ReqParameterError.ToString(),
}
return
}
return
}
// /英雄挂在装备
func (this *apiComp) Upgrade(session comm.IUserSession, req *pb.EquipmentUpgradeReq) (errdata *pb.ErrorData) {
var (
err error
conf *cfg.GameEquipData
intensify *cfg.GameEquipIntensifyData
equipment *pb.DB_Equipment
modifyequipments []*pb.DB_Equipment
hero *pb.DBHero
equipments []*pb.DB_Equipment
confs []*cfg.GameEquipData
suitconfs []*cfg.GameEquipSuitData
suits []*pb.DB_EquipmentSuit
suit *pb.DB_EquipmentSuit
issucc bool
user *pb.DBUser
tasks []*pb.BuriedParam = make([]*pb.BuriedParam, 0)
)
if errdata = this.UpgradeCheck(session, req); errdata != nil {
return
}
if equipment, err = this.module.modelEquipment.QueryUserEquipmentsById(session.GetUserId(), req.EquipmentId); err != nil {
this.module.Errorf("Equip_Check err:%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_EquipmentOnFoundEquipment,
Title: pb.ErrorCode_EquipmentOnFoundEquipment.ToString(),
Message: err.Error(),
}
return
}
if conf, err = this.module.configure.GetEquipmentConfigureById(equipment.CId); err != nil {
this.module.Errorf("Equip_Check err:%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_EquipmentOnFoundEquipment,
Title: pb.ErrorCode_EquipmentOnFoundEquipment.ToString(),
Message: err.Error(),
}
return
}
//找到下一个等级的相关配置
if intensify, err = this.module.configure.GetEquipmentIntensifyConfigureById(conf.EquipId, conf.Color, equipment.Lv); err != nil || intensify.Need == nil || len(intensify.Need) == 0 {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_EquipmentLvlimitReached,
Title: pb.ErrorCode_EquipmentLvlimitReached.ToString(),
Message: fmt.Sprintf("Lv:%d", equipment.Lv),
}
if err != nil {
this.module.Errorf("Equip_Check err:%v", err)
}
return
}
if errdata = this.module.ConsumeRes(session, intensify.Need, true); errdata != nil {
return
}
if equipment.KeepFailNum >= intensify.Num { //没有达到保底次数 根据概率随机成功失败
issucc = true
} else { //随机 千分比
n, _ := rand.Int(rand.Reader, big.NewInt(1000))
if int32(n.Int64()) < intensify.Probability {
issucc = true
equipment.KeepFailNum = 0
} else {
issucc = false
equipment.KeepFailNum++
if err = this.module.modelEquipment.ChangeList(session.GetUserId(), equipment.Id, map[string]interface{}{
"keepFailNum": equipment.KeepFailNum,
}); err != nil {
log.Errorf("Upgrade err:%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
return
}
}
}
if issucc {
modifyequipments = make([]*pb.DB_Equipment, 0)
//叠加装备 拆分处理
if equipment.IsInitialState && equipment.OverlayNum > 1 {
equipment.OverlayNum--
if err = this.module.modelEquipment.ChangeList(session.GetUserId(), equipment.Id, map[string]interface{}{
"overlayNum": equipment.OverlayNum,
"heroId": "",
}); err != nil {
this.module.Errorf("Upgrade err:%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
return
}
modifyequipments = append(modifyequipments, equipment)
equipment = CloneEquipment(equipment)
equipment.Id = primitive.NewObjectID().Hex()
equipment.IsInitialState = false
equipment.OverlayNum = 1
modifyequipments = append(modifyequipments, equipment)
if err = this.module.modelEquipment.upgradeEquipment(equipment, conf, intensify); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
this.module.Errorf("Upgrade err:%v", err)
return
}
if err = this.module.modelEquipment.AddList(session.GetUserId(), equipment.Id, equipment); err != nil {
this.module.Errorf("Upgrade err:%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
return
}
} else {
equipment.IsInitialState = false
modifyequipments = append(modifyequipments, equipment)
if err = this.module.modelEquipment.upgradeEquipment(equipment, conf, intensify); err != nil {
this.module.Errorf("Upgrade err:%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
return
}
if err = this.module.modelEquipment.ChangeList(session.GetUserId(), equipment.Id, map[string]interface{}{
"keepFailNum": equipment.KeepFailNum,
"lv": equipment.Lv,
"mainEntry": equipment.MainEntry,
"adverbEntry": equipment.AdverbEntry,
"adverbskill": equipment.Adverbskill,
"isInitialState": false,
}); err != nil {
log.Errorf("Upgrade err:%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_SystemError,
Title: pb.ErrorCode_SystemError.ToString(),
Message: err.Error(),
}
return
}
}
equipments = make([]*pb.DB_Equipment, 8)
confs = make([]*cfg.GameEquipData, 8)
suitconfs = make([]*cfg.GameEquipSuitData, 8)
//已装备 重新计算属性
if equipment.HeroId != "" {
if hero, errdata = this.module.ModuleHero.GetHeroByObjID(session.GetUserId(), equipment.HeroId); errdata != nil {
return
}
if conf.Pos >= 8 {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigurationException,
Title: pb.ErrorCode_ConfigurationException.ToString(),
Message: fmt.Sprintf("装备配置异常 id:%s pos:%d", conf.Id, conf.Pos),
}
return
}
hero.EquipID[conf.Pos] = equipment.Id //拆分后的装备是一个新的
for i, v := range hero.EquipID {
if v != "" {
if v != equipment.Id {
if equipments[i], err = this.module.modelEquipment.QueryUserEquipmentsById(session.GetUserId(), v); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_EquipmentOnFoundEquipment,
Title: pb.ErrorCode_EquipmentOnFoundEquipment.ToString(),
Message: fmt.Sprintf("未找到装备 uid:%s id:%s", session.GetUserId(), v),
}
return
}
if confs[i], err = this.module.configure.GetEquipmentConfigureById(equipments[i].CId); err != nil {
this.module.Errorf("Equip_Check err:%v", err)
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
}
if suitconfs[i], err = this.module.configure.getEquipSuit(confs[i].Suittype); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
}
} else {
equipments[i] = equipment
confs[i] = conf
if suitconfs[i], err = this.module.configure.getEquipSuit(confs[i].Suittype); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
}
}
suit = nil
for _, _suit := range suits {
if _suit.Suitid == confs[i].Suittype && !_suit.Effect { //找到一个未生效的套装
suit = _suit
break
}
}
if suit == nil {
suit = &pb.DB_EquipmentSuit{
Suitid: confs[i].Suittype,
Eids: []string{v},
Str: confs[i].Color,
Lv: equipments[i].Lv,
Effect: false,
}
if len(suit.Eids) >= int(suitconfs[i].Suitnum) {
suit.Effect = true
}
suits = append(suits, suit)
} else {
suit.Eids = append(suit.Eids, v)
if suit.Str < confs[i].Color {
suit.Str = confs[i].Color
}
if suit.Lv < equipments[i].Lv {
suit.Lv = equipments[i].Lv
}
if !suit.Effect && len(suit.Eids) >= int(suitconfs[i].Suitnum) {
suit.Effect = true
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype93, 1, suit.Suitid, suit.Lv))
tasks = append(tasks, comm.GetBuriedParam2(comm.Rtype45, equipment.Id, conf.Color, suit.Suitid, suit.Lv))
}
}
}
}
hero.Suits = suits
if errdata = this.module.ModuleHero.UpdateEquipment(session, hero, equipments); errdata != nil {
return
}
}
//随机任务触发
tasks = append(tasks, comm.GetBuriedParam2(comm.Rtype43, equipment.Id, equipment.Lv))
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype47, 1))
if conf.Pos == 7 {
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype102, 1))
} else if conf.Pos == 6 {
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype100, 1))
}
//聊天系统通知
if user = this.module.ModuleUser.GetUser(session.GetUserId()); user != nil {
this.module.chat.SendSysChatToWorld(comm.ChatSystem3, equipment, equipment.Lv, 0, user.Name, conf.Id)
} else {
this.module.Errorf("no found userdata uid:%s", session.GetUserId())
}
} else {
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype96, 1))
}
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype92, 1))
if len(tasks) > 0 {
go this.module.ModuleBuried.TriggerBuried(session.GetUserId(), tasks...)
}
session.SendMsg(string(this.module.GetType()), "upgrade", &pb.EquipmentUpgradeResp{IsSucc: issucc, Equipment: modifyequipments})
return
}