go_dreamfactory/modules/robot/modulerobot_hero.go
2023-08-28 13:49:51 +08:00

176 lines
4.0 KiB
Go

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 k, v := range this.heros {
if c, err := this.GMGetTalentByHeroId(k); err != nil {
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
}