package stonehenge import ( "fmt" "go_dreamfactory/comm" "go_dreamfactory/modules/battle" "go_dreamfactory/pb" cfg "go_dreamfactory/sys/configure/structs" "math" "strconv" ) //参数校验 func (this *apiComp) EventCheck(session comm.IUserSession, req *pb.StonehengeEventReq) (errdata *pb.ErrorData) { if req.Eventid == 0 { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), } } return } func (this *apiComp) Event(session comm.IUserSession, req *pb.StonehengeEventReq) (errdata *pb.ErrorData) { var ( stone *pb.DBStonehenge update map[string]interface{} roomConf *cfg.GameStoneRoomData err error newEvent int32 // 是否有新的事件 eventConf *cfg.GameStoneEventData reward []*pb.UserAtno curbuff int32 ) update = make(map[string]interface{}) if errdata = this.EventCheck(session, req); errdata != nil { return } if stone, err = this.module.modelStonehenge.GetStonehengeData(session.GetUserId()); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.String(), Message: err.Error(), } return } if eventConf, err = this.module.configure.GetStoneEventDataById(req.Eventid); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } return } // EventType29 特殊事件 if eventConf.EventType != EventType29 && eventConf.EventType != EventType10 { if stone.Rooms.Eventid[req.Eventid] { // 重复完成 errdata = &pb.ErrorData{ Code: pb.ErrorCode_StonehengeRepeatedReward, Title: pb.ErrorCode_StonehengeRepeatedReward.ToString(), Message: fmt.Sprintf("req.Eventid err :%d", req.Eventid), } return } } update["stageID"] = stone.StageID if roomConf, err = this.module.configure.GetStoneRoomDataById(stone.Rooms.Roomid); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } return } if len(eventConf.CostItem) > 0 { if errdata = this.module.CheckRes(session, eventConf.CostItem); errdata != nil { return } } switch eventConf.EventType { case EventType16: // 捡垃圾事件 user := this.module.ModuleUser.GetUser(session.GetUserId()) if lotteryward := this.module.ModuleTools.GetGroupDataByLottery(eventConf.Value1, user.Vip, user.Lv); len(lotteryward) > 0 { if errdata, reward = this.module.DispenseAtno(session, lotteryward, true); errdata != nil { this.module.Debugf("Mline lotteryward DispenseRes err:+%v", lotteryward) } } case EventType25: // buff 三选一 lenSelect := len(stone.Rooms.Selectbuff) if pos, err := strconv.Atoi(req.Param1); err == nil { if lenSelect == 0 || lenSelect <= pos { return } buffid := stone.Rooms.Selectbuff[pos] // 加入收藏 if conf, err := this.module.configure.GetStoneBuffDataById(buffid); err == nil { stone.Userbuff[buffid] = 1 stone.Rooms.Selectbuff = []int32{} update["userbuff"] = stone.Userbuff this.module.modelStonehengeBook.addStonehengeBook(session.GetUserId(), conf.Type, buffid) } } else { // 参数错误 errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), Message: err.Error(), } return } case EventType14: case EventType28: // 战斗事件 if req.Report == nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), Message: fmt.Sprintf("BattleReport is nil"), } return } bWin := false errdata, bWin = this.module.battle.CheckBattleReport(session, req.Report) if errdata != nil { return } if !bWin { // 战斗失败直接返回 return } // 掉落奖励 if conf, err := this.module.configure.GetStoneEventDataById(req.Eventid); err == nil { if battleConf, err := this.module.configure.GetBattleConfById(conf.Value1); err == nil { user := this.module.ModuleUser.GetUser(session.GetUserId()) if lotteryward := this.module.ModuleTools.GetGroupDataByLottery(battleConf.RewardLottery, user.Vip, user.Lv); len(lotteryward) > 0 { if errdata, reward = this.module.DispenseAtno(session, lotteryward, true); errdata != nil { this.module.Debugf("Mline lotteryward DispenseRes err:+%v", lotteryward) } } } } for _, v := range req.Report.Alive { bAlive := false for _, v1 := range stone.Rooms.Hero { // 注意 阵亡英雄不在存货列表内 if v.Oid == v1 { stone.Hero[v.Oid] = v // 找到了说明英雄还在 bAlive = true break } } if !bAlive { // 英雄死亡处理 stone.Hero[v.Oid].Currhp = 0 } } stone.Rooms.Hero = []string{} // 上阵英雄清理 update["hero"] = stone.Hero case EventType10: // 宝箱事件 // 通关了才能领取宝箱 if !stone.Rooms.Complete { errdata = &pb.ErrorData{ Code: pb.ErrorCode_StonehengeNoComplete, Title: pb.ErrorCode_StonehengeNoComplete.ToString(), } return } // 次数校验 if stone.Rooms.Box[req.Eventid] < eventConf.Value2 { user := this.module.ModuleUser.GetUser(session.GetUserId()) // 校验消耗是否 // if len(eventConf.CostItem) > 0 { // if errdata = this.module.ConsumeRes(session, eventConf.CostItem, true); errdata != nil { // return // } // } if lotteryward := this.module.ModuleTools.GetGroupDataByLottery(eventConf.Value1, user.Vip, user.Lv); len(lotteryward) > 0 { if errdata, reward = this.module.DispenseAtno(session, lotteryward, true); errdata != nil { this.module.Debugf("Mline lotteryward DispenseRes err:+%v", lotteryward) } } stone.Rooms.Box[req.Eventid] += 1 // 更新宝箱进度 } else { errdata = &pb.ErrorData{ Code: pb.ErrorCode_StonehengeRewardBoxFailed, Title: pb.ErrorCode_StonehengeRewardBoxFailed.ToString(), } return } case EventType17: // 英雄回血 case EventType18: var sz []int32 // 获取 var szHero []string for _, v := range stone.Hero { if v.Currhp > 0 { szHero = append(szHero, v.Oid) sz = append(sz, 100) } } for _, v := range comm.GetRandWs(sz, eventConf.Value2) { objId := szHero[v] maxHp := stone.Hero[objId].Property[battle.AttributesTransBase("hp")] stone.Hero[objId].Currhp += int32(math.Floor(float64(maxHp*eventConf.Value1) / 1000)) // 回血 } update["hero"] = stone.Hero case EventType19: var sz []int32 // 获取 var szHero []string for _, v := range stone.Hero { // 过滤死亡英雄 if v.Currhp > 0 { szHero = append(szHero, v.Oid) sz = append(sz, 100) } } for _, v := range comm.GetRandWs(sz, eventConf.Value2) { objId := szHero[v] stone.Hero[objId].Currhp -= int32(math.Floor(float64(stone.Hero[objId].Currhp*eventConf.Value1) / 1000)) // 扣除当前生命值X(千分比) } update["hero"] = stone.Hero case EventType20: // 克隆一名英雄 if _, ok := stone.Hero[req.Param1]; ok { errdata = &pb.ErrorData{ Code: pb.ErrorCode_StonehengeHeroRepeated, Message: pb.ErrorCode_StonehengeHeroRepeated.ToString(), } return } // 查库 if hero, err := this.module.ModuleHero.GetHeroByObjID(session.GetUserId(), req.Param1); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_HeroNoExist, Message: pb.ErrorCode_HeroNoExist.ToString(), } return } else { var roles []*pb.BattleRole if roles, errdata = this.module.battle.CreateRolesByHeros([]*pb.DBHero{hero}); errdata != nil { return } if len(roles) == 1 { roles[0].Tid = 100 + int32(len(stone.Hero)) stone.Hero[req.Param1] = roles[0] } } update["hero"] = stone.Hero case EventType23: // 事件buff 强化 case EventType29: // 商店强化 if num, err := strconv.Atoi(req.Param1); err == nil { buffid := int32(num) if _, ok := stone.Userbuff[buffid]; ok { if EventType29 == eventConf.EventType { // 商店消耗 走特殊消耗 if oldbufConf, e := this.module.configure.GetStoneBuffDataById(buffid); e == nil { if oldbufConf.BuffUpgradeCost.N > 0 { if errdata = this.module.ConsumeRes(session, []*cfg.Gameatn{oldbufConf.BuffUpgradeCost}, true); errdata != nil { // 校验消耗 return } } } else { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: e.Error(), } return } } if newbufConf, e := this.module.configure.GetStoneBuffDataById(buffid + 1); e == nil { stone.Userbuff[newbufConf.BuffId] = 1 delete(stone.Userbuff, buffid) // 删除旧buff update["userbuff"] = stone.Userbuff curbuff = newbufConf.BuffId } else { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: e.Error(), } return } } } } stone.Rooms.Eventid[req.Eventid] = true // // 校验事件有后续事件 if eventConf.Probability >= comm.GetRandNum(0, 1000) { // 命中 newEvent = eventConf.PostEvent this.module.modelStonehenge.AddNewEvent([]int32{eventConf.PostEvent}, stone) } stone.Rooms.Complete = true for _, v := range roomConf.Condition { for k, ok := range stone.Rooms.Eventid { if !ok { if eventConf, err = this.module.configure.GetStoneEventDataById(k); err == nil { if eventConf.EventType == v { stone.Rooms.Complete = false break } } } } if !stone.Rooms.Complete { break } } if stone.Rooms.Complete { // 完成关卡 发放当前关奖励 if conf := this.module.configure.GetStageConfByStageid(stone.StageID, stone.CurRoomIndes); conf != nil { if len(conf.FirstReward) > 0 { if errdata, reward = this.module.DispenseAtno(session, conf.FirstReward, true); errdata != nil { return } } } } if errdata = this.module.ConsumeRes(session, eventConf.CostItem, true); errdata != nil { //真正的消耗 return } update["rooms"] = stone.Rooms this.module.modelStonehenge.ChangeStonehengeData(session.GetUserId(), update) session.SendMsg(string(this.module.GetType()), "event", &pb.StonehengeEventResp{ Eventid: req.Eventid, NewEvent: newEvent, Room: stone.Rooms, Reward: reward, Hero: stone.Hero, Userbuff: stone.Userbuff, Curbuff: curbuff, }) return }