go_dreamfactory/modules/robot/modulerobot_equipment.go
2023-09-08 15:11:09 +08:00

423 lines
11 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_Equipment struct {
equipments map[string]*pb.DB_Equipment
}
func (this *ModuleRobot_Equipment) Init() (err error) {
this.equipments = make(map[string]*pb.DB_Equipment)
return
}
//接收到消息
func (this *ModuleRobot_Equipment) Receive(robot IRobot, stype string, message proto.Message) (err error) {
switch stype {
case "getlist":
resp := message.(*pb.EquipmentGetListResp)
for _, v := range resp.Equipments {
this.equipments[v.Id] = v
}
break
case "upgrade":
resp := message.(*pb.EquipmentUpgradeResp)
for _, v := range resp.Equipment {
this.equipments[v.Id] = v
}
return
case "change":
resp := message.(*pb.EquipmentChangePush)
for _, v := range resp.Equipments {
this.equipments[v.Id] = v
}
break
}
return
}
func (this *ModuleRobot_Equipment) OncePipeline(robot IRobot) (err error) {
var (
errdata *pb.ErrorData
)
if _, errdata = robot.SendMessage("equipment", "getlist", &pb.EquipmentGetListReq{}); errdata != nil {
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
return
}
return
}
//机器人执行流
func (this *ModuleRobot_Equipment) DoPipeline(robot IRobot) (err error) {
var (
errdata *pb.ErrorData
equipment *pb.DB_Equipment
lv int32 = 15
)
if equipment, err = this.findcanupgrade(lv); err != nil {
return
}
if _, errdata = robot.SendMessage("equipment", "upgrade", &pb.EquipmentUpgradeReq{
EquipmentId: equipment.Id,
}); errdata != nil {
if errdata.Code == pb.ErrorCode_EquipmentLvlimitReached {
err = nil
return
} else {
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
}
return
}
return
}
//做任务
func (this *ModuleRobot_Equipment) DoTask(robot IRobot, taskconf *cfg.GameWorldTaskData, condconf *cfg.GameBuriedCondiData) (err error) {
var (
errdata *pb.ErrorData
)
switch comm.TaskType(condconf.Type) {
case comm.Rtype5: //穿戴
var (
heromodule *ModuleRobot_Hero
heros map[string]*pb.DBHero
equipments []string
hero *pb.DBHero
change bool
)
heromodule = robot.GetModule(comm.ModuleHero).(*ModuleRobot_Hero)
heros = heromodule.heros
for _, hero = range heros {
if equipments, change, err = this.findcanEquipEquipment(hero, 0); err != nil {
return
}
if change {
break
}
}
if change {
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "equipment", "equip", &pb.EquipmentEquipReq{
HeroCardId: hero.Id,
EquipmentId: equipments,
}); errdata != nil {
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
return
}
} else {
err = fmt.Errorf("no fund can use equipments")
}
case comm.Rtype41: //穿戴
var (
heromodule *ModuleRobot_Hero
heros map[string]*pb.DBHero
equipments []string
hero *pb.DBHero
change bool
)
heromodule = robot.GetModule(comm.ModuleHero).(*ModuleRobot_Hero)
heros = heromodule.heros
for _, hero = range heros {
if equipments, change, err = this.findcanEquipEquipment(hero, condconf.Filter[0]); err != nil {
return
}
if change {
break
}
}
if change {
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "equipment", "equip", &pb.EquipmentEquipReq{
HeroCardId: hero.Id,
EquipmentId: equipments,
}); errdata != nil {
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
return
}
} else {
err = fmt.Errorf("no fund can use equipments")
}
case comm.Rtype169: //穿戴套装
var (
heromodule *ModuleRobot_Hero
hero string
equipments []string
)
heromodule = robot.GetModule(comm.ModuleHero).(*ModuleRobot_Hero)
hero = heromodule.getbattlehero()[0]
if equipments, err = this.findsuitEquipment(condconf.Filter[0]); err != nil {
return
}
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "equipment", "equip", &pb.EquipmentEquipReq{
HeroCardId: hero,
EquipmentId: equipments,
}); errdata != nil {
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
return
}
break
case comm.Rtype43, comm.Rtype92, comm.Rtype96: //强化
var (
equipment *pb.DB_Equipment
lv int32 = 15
)
if comm.TaskType(condconf.Type) == comm.Rtype43 {
lv = condconf.Filter[0]
}
if equipment, err = this.findcanupgrade(lv); err != nil {
return
}
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "equipment", "upgrade", &pb.EquipmentUpgradeReq{
EquipmentId: equipment.Id,
}); errdata != nil {
if errdata.Code == pb.ErrorCode_EquipmentLvlimitReached {
err = nil
return
} else {
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
}
return
}
case comm.Rtype94: //附魔
var (
equipment *pb.DB_Equipment
itemmodule *ModuleRobot_Item
items map[string]*pb.DB_UserItemData
confs []*cfg.GameEquipEnchantingData
item *pb.DB_UserItemData
)
if equipment, err = this.findmaxlvEquipment(); err != nil {
return
}
itemmodule = robot.GetModule(comm.ModuleItems).(*ModuleRobot_Item)
items = itemmodule.items
if confs, err = this.getEquipenchantings(); err != nil {
return
}
for _, conf := range confs {
for _, v := range items {
if conf.Item == v.ItemId { //找到消耗道具
item = v
break
}
}
}
if item != nil {
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "equipment", "ench", &pb.EquipmentEnchReq{
Eid: equipment.Id,
Itemid: item.GridId,
Index: 0,
}); errdata != nil {
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
return
}
}
case comm.Rtype95: //洗练
var (
equipment *pb.DB_Equipment
resp proto.Message
pids []int32
)
if equipment, err = this.findmaxlvEquipment(); err != nil {
return
}
if resp, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "equipment", "wash", &pb.EquipmentWashReq{
Eid: equipment.Id,
}); errdata != nil {
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
return
}
pids = make([]int32, 0)
for _, v := range resp.(*pb.EquipmentWashResp).AdverbEntry {
pids = append(pids, v.Libraryid)
}
if _, errdata = robot.SendTaskMessage(taskconf.Key, condconf.Id, "equipment", "washconfirm", &pb.EquipmentWashConfirmReq{
Eid: equipment.Id,
Pids: pids,
}); errdata != nil {
err = errors.New(fmt.Sprintf("code:%d message:%s", errdata.Code, errdata.Message))
return
}
}
return
}
//查询套装装备
func (this *ModuleRobot_Equipment) findsuitEquipment(sid int32) (equipments []string, err error) {
var (
econf *cfg.GameEquipData
)
equipments = make([]string, 8)
for _, equipment := range this.equipments {
if equipment.HeroId != "" {
continue
}
if econf, err = this.getGameEquipData(equipment.CId); err != nil {
return
}
if econf.Suittype == sid {
equipments[econf.Pos] = equipment.Id
}
}
return
}
//查询能穿戴的装备
func (this *ModuleRobot_Equipment) findcanEquipEquipment(hero *pb.DBHero, minstar int32) (equipments []string, change bool, err error) {
var (
conf *cfg.GameEquipData
)
equipments = hero.EquipID
for i, v := range hero.EquipID {
if v == "" {
for _, equipment := range this.equipments {
if equipment.HeroId == "" {
if conf, err = this.getGameEquipData(equipment.CId); err != nil {
return
}
if conf.Color < minstar {
continue
}
if conf.Pos == int32(i) { //找到匹配装备
equipments[i] = equipment.Id
change = true
}
}
}
}
}
return
}
//查询能强化的装备
func (this *ModuleRobot_Equipment) findcanupgrade(lv int32) (equipment *pb.DB_Equipment, err error) {
var (
equipments []*pb.DB_Equipment = make([]*pb.DB_Equipment, 0, len(this.equipments))
conf *cfg.GameEquipData
upconf *cfg.GameEquipIntensifyData
)
var ()
for _, v := range this.equipments {
if v.Lv < lv {
equipments = append(equipments, v)
}
}
sort.Slice(equipments, func(i, j int) bool {
return equipments[i].Lv > equipments[j].Lv
})
for _, equipment = range equipments {
if conf, err = this.getGameEquipData(equipment.CId); err != nil {
return
}
if upconf, err = this.getEquipmentMaxIntensifyConfigure(conf.EquipId, conf.Color); err == nil && upconf.Level >= equipment.Lv {
return
}
}
equipment = nil
err = fmt.Errorf("no fund can upgrade equipment")
return
}
//查询能强化的装备
func (this *ModuleRobot_Equipment) findmaxlvEquipment() (equipment *pb.DB_Equipment, err error) {
var (
equipments []*pb.DB_Equipment = make([]*pb.DB_Equipment, 0, len(this.equipments))
)
if len(this.equipments) == 0 {
err = fmt.Errorf("no found can use equipment")
return
}
for _, v := range this.equipments {
equipments = append(equipments, v)
}
sort.Slice(equipments, func(i, j int) bool {
return equipments[i].Lv > equipments[j].Lv
})
equipment = equipments[0]
return
}
// 读取条件任务id配置
func (this *ModuleRobot_Equipment) getGameEquipData(cid string) (conf *cfg.GameEquipData, err error) {
var (
v interface{}
ok bool
)
if v, err = configure.GetConfigure(game_equip); err != nil {
return
} else {
if conf, ok = v.(*cfg.GameEquip).GetDataMap()[cid]; !ok {
err = comm.NewNotFoundConfErr("robot", game_buriedcondi, cid)
return
}
}
return
}
// 读取条件任务id配置
func (this *ModuleRobot_Equipment) getEquipmentMaxIntensifyConfigure(etype, star int32) (conf *cfg.GameEquipIntensifyData, err error) {
var (
v interface{}
lv int32
)
if v, err = configure.GetConfigure(game_equipintensify); err != nil {
return
} else {
for _, v1 := range v.(*cfg.GameEquipIntensify).GetDataList() {
if v1.TypeId == etype && v1.Star == star && len(v1.Need) > 0 && v1.Level > lv {
lv = v1.Level
conf = v1
}
}
if conf == nil {
err = fmt.Errorf("GetEquipmentMaxIntensifyConfigure not found star :%d lv:%d", star, lv)
return
}
}
return
}
// 获取附魔数据
func (this *ModuleRobot_Equipment) getEquipenchantings() (confs []*cfg.GameEquipEnchantingData, err error) {
var (
v interface{}
)
if v, err = configure.GetConfigure(game_equipenchanting); err != nil {
return
} else {
confs = v.(*cfg.GameEquipEnchanting).GetDataList()
}
return
}
// 获取装备套装配置
func (this *ModuleRobot_Equipment) getGameEquipSuitData(sid int32) (conf *cfg.GameEquipSuitData, err error) {
var (
v interface{}
ok bool
)
if v, err = configure.GetConfigure(equip_suit); err != nil {
return
} else {
if conf, ok = v.(*cfg.GameEquipSuit).GetDataMap()[sid]; !ok {
err = comm.NewNotFoundConfErr("robot", equip_suit, sid)
return
}
}
return
}