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...) }