go_dreamfactory/modules/stonehenge/api_event.go

273 lines
8.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
newEventConf *cfg.GameStoneEventData //新的事件配置
reward []*pb.UserAtno
)
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 v, ok := stone.Rooms.Eventid[req.Eventid]; !ok || v == true { // 不存在该事件
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ReqParameterError,
Title: pb.ErrorCode_ReqParameterError.ToString(),
Message: fmt.Sprintf("req.Eventid err :%d", req.Eventid),
}
return
}
_, bBox := stone.Rooms.Box[req.Eventid]
if stone.Rooms.Eventid[req.Eventid] || bBox { // 重复完成
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 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
}
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
}
stone.Userbuff[stone.Rooms.Selectbuff[pos]] = 1
stone.Rooms.Selectbuff = []int32{}
update["userbuff"] = stone.Userbuff
} else { // 参数错误
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ReqParameterError,
Title: pb.ErrorCode_ReqParameterError.ToString(),
Message: err.Error(),
}
}
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 bBox && 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
}
stone.Rooms.Eventid[req.Eventid] = true //
// 校验事件有后续事件
if eventConf.Probability >= comm.GetRandNum(0, 1000) { // 命中
newEvent = eventConf.PostEvent
stone.Rooms.Eventid[newEvent] = false //
if newEventConf, err = this.module.configure.GetStoneEventDataById(newEvent); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_ConfigNoFound,
Title: pb.ErrorCode_ConfigNoFound.ToString(),
Message: err.Error(),
}
return
}
switch newEventConf.EventType {
case EventType25: // buff是3选1
for _, v := range stone.Addweight {
ownerbuff := make(map[int32]struct{}, 0)
for k := range stone.Userbuff {
ownerbuff[k] = struct{}{}
}
stone.Rooms.Selectbuff = this.module.configure.GetBuffGroupDataByLottery(newEventConf.Value1, v, ownerbuff)
}
case EventType10: // 宝箱事件
if _, ok := stone.Rooms.Box[newEventConf.EventId]; !ok {
stone.Rooms.Box[newEventConf.EventId] = 0
}
}
}
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
}
}
// 通过条件判断
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,
})
return
}