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, conf.SkillId) } // 查特权 for _, v := range stone.Privilege { if v == 3 { // // 记录buff 三选一的次数 stone.Selectcount++ if stone.Selectcount == 3 { //可额外触发一次随机buff三选一事件 if c, err := this.module.configure.getGameStonePrivilegeData(3); err != nil { newEvent = c.Value1 } } break } } } 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 } } for k, v := range stone.Rooms.Passive { if conf, err := this.module.configure.GetStoneEventDataById(k); err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ConfigNoFound, Title: pb.ErrorCode_ConfigNoFound.ToString(), Message: err.Error(), } return } else { if conf.EventType == EventType30 { //扣除每名敌方最大生命值 delete(stone.Rooms.Passive, k) } else if conf.EventType == EventType31 { v-- if v <= 0 { delete(stone.Rooms.Passive, k) } } } } 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 } } } case EventType13: // 扣除背包中指定道具数量 amount := this.module.ModuleItems.QueryItemAmount(session.GetUserId(), strconv.Itoa(int(eventConf.Value2))) // 查询道具的数量 if amount > 0 { if n := math.Floor(float64(int32(amount)*eventConf.Value1) / 1000); n > 0 { atn := &cfg.Gameatn{ A: "item", T: strconv.Itoa(int(eventConf.Value2)), N: int32(n), } if errdata = this.module.ConsumeRes(session, []*cfg.Gameatn{atn}, true); errdata != nil { return } } } case EventType24: // 增加背包中指定道具数量 amount := this.module.ModuleItems.QueryItemAmount(session.GetUserId(), strconv.Itoa(int(eventConf.Value2))) if amount > 0 { if n := math.Floor(float64(int32(amount)*eventConf.Value1) / 1000); n > 0 { atn := &cfg.Gameatn{ A: "item", T: strconv.Itoa(int(eventConf.Value2)), N: int32(n), } if errdata = this.module.DispenseRes(session, []*cfg.Gameatn{atn}, true); errdata != nil { return } } } case EventType26: //所有1级buff强化至2级 // 查询所有1级buff for _, v := range stone.Userbuff { if conf, e := this.module.configure.GetStoneBuffDataById(v); e != nil { if conf.BuffLevel == 1 { // 是否有2级 if nextConf, e := this.module.configure.GetStoneBuffDataById(v + 1); e != nil { delete(stone.Userbuff, v) stone.Userbuff[nextConf.BuffId] = 1 } } } } update["userbuff"] = stone.Userbuff } stone.Rooms.Eventid[req.Eventid] = true // // 校验事件有后续事件 if newEvent == 0 && 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 }