go_dreamfactory/modules/realarena/romm.go
2024-03-12 18:45:18 +08:00

250 lines
6.3 KiB
Go

package realarena
import (
"fmt"
"go_dreamfactory/comm"
"go_dreamfactory/pb"
cfg "go_dreamfactory/sys/configure/structs"
"google.golang.org/protobuf/proto"
)
// /装备 数据组件
type Room struct {
Id string
ServicePath string
module *RealArena
sessions []comm.IUserSession
members []*pb.DBRealArenaMember
state int //0 无状态 1选择英雄阶段 2禁用英雄阶段 3选择队长阶段 4战斗中
step int // 阶段
handle string // 操作玩家
}
func (this *Room) init() (err error) {
this.PushMessage("matchsucc", &pb.RealArenaMatchSuccPush{
Race: &pb.DBRealArenaRace{
Id: this.Id,
ServicePath: this.ServicePath,
Red: this.members[0],
Bule: this.members[1],
},
})
this.handle = this.members[0].User.Uid
this.step = 1
this.PushMessage("startselecthero", &pb.RealArenaStartSelectHeroPush{
Uid: this.members[0].User.Uid,
Num: 1,
Countdown: 60,
})
return
}
//选择英雄
func (this *Room) selectheros(uid string, heros []*pb.HeroBase) (err error) {
var (
num int32
)
if uid != this.handle {
err = fmt.Errorf("cant handle!")
return
}
for _, v := range this.members {
if v.User.Uid == uid {
v.Heros = make([]string, len(heros))
for i, hero := range heros {
if hero != nil {
v.Heros[i] = hero.Old
}
}
} else {
this.handle = v.User.Uid
}
}
this.step++
switch this.step {
case 1, 6:
num = 1
break
case 2, 3, 4, 5:
num = 2
break
default:
num = 1
break
}
this.PushMessage("selecthero", &pb.RealArenaSelectHeroPush{
Uid: uid,
Heros: heros,
})
if this.step == 7 { //选完了
this.PushMessage("startdisablehero", &pb.RealArenaStartDisableHeroPush{
Uid: this.members[1].User.Uid,
Countdown: 60,
})
} else {
this.PushMessage("startselecthero", &pb.RealArenaStartSelectHeroPush{
Uid: this.handle,
Num: num,
Countdown: 60,
})
}
return
}
//禁用英雄
func (this *Room) disableheros(uid string, index int32) (err error) {
var finish bool
finish = true
for _, v := range this.members {
if v.User.Uid != uid {
v.Disable = index
v.Heros[index] = ""
}
if v.Disable == -1 {
finish = false
}
}
this.PushMessage("disablehero", &pb.RealArenaDisableHeroPush{
Uid: uid,
Index: index,
})
if finish {
this.PushMessage("startselectleader", &pb.RealArenaStartSelectLeaderPush{
Countdown: 60,
})
} else {
this.PushMessage("startdisablehero", &pb.RealArenaStartDisableHeroPush{
Uid: this.members[0].User.Uid,
Countdown: 60,
})
}
return
}
//选择队长
func (this *Room) selectleader(uid string, index int32) (err error) {
var finish bool
finish = true
for _, v := range this.members {
if v.User.Uid == uid {
v.Leader = index
}
if v.Leader == -1 {
finish = false
}
}
this.PushMessage("selectleader", &pb.RealArenaSelectLeaderPush{
Uid: uid,
Index: index,
})
if finish {
var (
uinfos []*pb.BaseUserInfo = make([]*pb.BaseUserInfo, 0)
formations []*pb.BattleFormation = make([]*pb.BattleFormation, 0)
sessions []comm.IUserSession = make([]comm.IUserSession, 0)
)
uinfos = append(uinfos, this.members[0].User, this.members[1].User)
sessions = append(sessions, this.sessions[0].Clone(), this.sessions[1].Clone())
formations = append(formations,
&pb.BattleFormation{Leadpos: this.members[0].Leader, Format: this.members[0].Heros},
&pb.BattleFormation{Leadpos: this.members[1].Leader, Format: this.members[1].Heros},
)
err = this.module.pvp.AddAndStartRoom(this.Id, pb.PlayType_realarena, sessions, uinfos, formations)
}
return
}
func (this *Room) UserOffline(uid string) (err error) {
var winSide int32 = 1
if this.members[0].User.Uid == uid {
winSide = 2
}
this.module.ChallengeResults(this.Id, this.members[0].User.Uid, this.members[1].User.Uid, winSide, nil)
return
}
func (this *Room) ChallengeResults(winSide int32) {
var (
conf *cfg.GameArenarealtimeConfigData
errdata *pb.ErrorData
err error
)
this.module.model.integralCompute(this.members[0], this.members[1], winSide)
this.module.modelRank.updateArenaRank(this.members...)
if err = this.module.model.change(this.members[0].User.Uid, map[string]interface{}{
"state": 0,
"roomid": "",
"roompath": "",
"rank": this.members[0].Rank,
"dan": this.members[0].Dan,
"integral": this.members[0].Integral,
}); err != nil {
this.module.Errorln(err)
return
}
if err = this.module.model.change(this.members[1].User.Uid, map[string]interface{}{
"state": 0,
"roomid": "",
"roompath": "",
"rank": this.members[1].Rank,
"dan": this.members[1].Dan,
"integral": this.members[1].Integral,
}); err != nil {
this.module.Errorln(err)
return
}
if winSide == 1 {
if conf, err = this.module.configure.getGameArenarealtimeConfig(this.members[0].Dan); err != nil {
this.module.Errorln(err)
return
}
if errdata, this.members[0].Award = this.module.DispenseAtno(this.sessions[0], conf.WinReward, true); errdata != nil {
this.module.Errorln(errdata)
return
}
if conf, err = this.module.configure.getGameArenarealtimeConfig(this.members[1].Dan); err != nil {
this.module.Errorln(err)
return
}
if errdata, this.members[1].Award = this.module.DispenseAtno(this.sessions[1], conf.LoseReward, true); errdata != nil {
this.module.Errorln(errdata)
return
}
} else {
if conf, err = this.module.configure.getGameArenarealtimeConfig(this.members[0].Dan); err != nil {
this.module.Errorln(err)
return
}
if errdata, this.members[0].Award = this.module.DispenseAtno(this.sessions[0], conf.LoseReward, true); errdata != nil {
this.module.Errorln(errdata)
return
}
if conf, err = this.module.configure.getGameArenarealtimeConfig(this.members[1].Dan); err != nil {
this.module.Errorln(err)
return
}
if errdata, this.members[1].Award = this.module.DispenseAtno(this.sessions[1], conf.WinReward, true); errdata != nil {
this.module.Errorln(errdata)
return
}
}
for _, v := range this.sessions {
v.Push()
}
this.PushMessage("battlefinish", &pb.RealArenaBattleFinishPush{
Roomid: this.Id,
Winside: winSide,
Red: this.members[0],
Bule: this.members[1],
})
}
func (this *Room) PushMessage(stype string, msg proto.Message) {
this.module.SendMsgSyncToSession(string(this.module.GetType()), stype, msg, this.sessions...)
}