250 lines
6.3 KiB
Go
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...)
|
|
}
|