package robot import ( "errors" "fmt" "go_dreamfactory/comm" "go_dreamfactory/pb" "go_dreamfactory/sys/configure" cfg "go_dreamfactory/sys/configure/structs" "sort" "google.golang.org/protobuf/proto" ) //用户模块 机器人 type ModuleRobot_Hero struct { heros map[string]*pb.DBHero talent []*pb.DBHeroTalent // 天赋数据 } func (this *ModuleRobot_Hero) Init() (err error) { this.heros = make(map[string]*pb.DBHero) return } //接收到消息 func (this *ModuleRobot_Hero) Receive(robot IRobot, stype string, message proto.Message) (err error) { switch stype { case "list": resp := message.(*pb.HeroListResp) for _, v := range resp.List { this.heros[v.Id] = v } break case "change": resp := message.(*pb.HeroChangePush) for _, v := range resp.List { this.heros[v.Id] = v } break case "talentlist": // 获取天赋数据 resp := message.(*pb.HeroTalentListResp) this.talent = resp.Telnet break } return } //机器人执行流 func (this *ModuleRobot_Hero) DoPipeline(robot IRobot) (err error) { var ( errdata *pb.ErrorData ) if _, errdata = robot.SendMessage("hero", "list", &pb.HeroListReq{}); errdata != nil { err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message)) return } if _, errdata = robot.SendMessage("hero", "talentlist", &pb.HeroTalentListReq{}); errdata != nil { err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message)) return } return } //做任务 func (this *ModuleRobot_Hero) DoTask(robot IRobot, taskconf *cfg.GameWorldTaskData, condconf *cfg.GameBuriedCondiData) (err error) { var ( errdata *pb.ErrorData ) switch comm.TaskType(condconf.Type) { case comm.Rtype14: if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "hero", "drawcard", &pb.HeroDrawCardReq{DrawType: 2, DrawCount: 1, Consume: 0}); errdata != nil { err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message)) return } case comm.Rtype199: resp := &pb.HeroTalentLearnReq{ TalentID: 0, ObjId: "", Heroid: "", } // check 该英雄天赋满级 bMax := false // 获取英雄数据 var bFound bool for _, v := range this.heros { if c, err := this.GMGetTalentByHeroId(v.HeroID); err == nil { if this.talent == nil { resp.TalentID = c[0].Skillid resp.Heroid = v.HeroID } else { for _, v1 := range this.talent { if len(v1.Talent) == len(c) { bMax = true break } if v1.HeroId == v.HeroID { bFound = true resp.ObjId = v1.Id resp.Heroid = v.HeroID // 依次往后学 if len(v1.Talent) < len(c) { resp.TalentID = c[len(v1.Talent)].Skillid } break } } } } if !bMax { // 当前英雄全满共鸣后 继续找下一个英雄 continue } break } if !bFound { resp.ObjId = "" } if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "hero", "talentlearn", resp); errdata != nil { err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message)) return } } return } //获取战斗英雄 func (this *ModuleRobot_Hero) getbattlehero() (bheros []string) { var ( heros []*pb.DBHero = make([]*pb.DBHero, 0, len(this.heros)) ) bheros = make([]string, 5) for _, v := range this.heros { heros = append(heros, v) } // 使用sort.Slice进行排序 sort.Slice(heros, func(i, j int) bool { return heros[i].Lv > heros[j].Lv }) for i, v := range heros { if i < 5 { bheros[i] = v.Id } else { return } } return } //获取武官训练英雄英雄 func (this *ModuleRobot_Hero) getpracticehero() (bheros string) { for _, v := range this.heros { if v.Status != pb.HeroType_HeroTypeKongFu { return v.Id } } return } func (this *ModuleRobot_Hero) GMGetTalentByHeroId(hid string) (data []*cfg.GameHeroTalentData, err error) { var ( v interface{} ) if v, err = configure.GetConfigure(hero_talent); err == nil { if configure, ok := v.(*cfg.GameHeroTalent); ok { for _, v1 := range configure.GetDataList() { if v1.Hid == hid { data = append(data, v1) } } } } if len(data) == 0 { err = comm.NewNotFoundConfErr("robot", hero_talent, hid) } return }