go_dreamfactory/modules/stonehenge/api_event.go
2023-08-16 17:42:03 +08:00

410 lines
13 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
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
}