package hero import ( "fmt" "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/log" "go_dreamfactory/modules" "go_dreamfactory/pb" "math" mengine "github.com/dengsgo/math-engine/engine" "go.mongodb.org/mongo-driver/bson/primitive" ) type ModelHero struct { modules.Model_Comp moduleHero *Hero } func (this *ModelHero) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { err = this.Model_Comp.Init(service, module, comp, options) this.moduleHero = module.(*Hero) this.TableName = "hero" return } //初始化英雄 func (this *ModelHero) initHero(uid string, heroCfgId int32) *pb.DB_HeroData { heroCfg := this.moduleHero.configure_comp.GetHero(heroCfgId) if heroCfg == nil { log.Errorf("%v hero not found from config %v", heroCfgId) return nil } objId := primitive.NewObjectID().Hex() newHero := &pb.DB_HeroData{ Id: objId, Uid: uid, HeroID: heroCfg.Id, Star: heroCfg.Star, Lv: 1, //初始等级 NormalSkill: []*pb.SkillData{}, Skins: []int32{}, EquipID: make([]string, 6), AddProperty: make(map[int32]int32), Energy: make(map[int32]int32), Property: make(map[int32]int32), } return newHero } //创建一个指定的英雄 func (this *ModelHero) createOneHero(uid string, heroCfgId int32) error { hero := this.initHero(uid, heroCfgId) if hero != nil { return this.moduleHero.model_hero.AddList(uid, hero.Id, hero) } return nil } //创建多个指定的英雄 func (this *ModelHero) createMultiHero(uid string, heroCfgId ...int32) error { data := make(map[string]interface{}) for _, v := range heroCfgId { hero := this.initHero(uid, v) if hero != nil { data[hero.Id] = hero } } return this.moduleHero.model_hero.AddLists(uid, data) } //获取一个英雄 func (this *ModelHero) getOneHero(uid, heroId string) *pb.DB_HeroData { hero := &pb.DB_HeroData{} err := this.moduleHero.model_hero.GetListObj(uid, heroId, hero) if err != nil { return nil } return hero } //获取玩家的英雄列表 func (this *ModelHero) getHeroList(uid string) ([]*pb.DB_HeroData, error) { herokeys := make(map[string]string) err := this.Get(uid, herokeys) if err != nil { return nil, err } heroes := make([]*pb.DB_HeroData, 0) err = this.GetList(uid, &heroes) if err != nil { return nil, err } return heroes, nil } //更新装备 func (this *ModelHero) setEquipment(uid, heroId string, equipIds []string) pb.ErrorCode { hero := this.getOneHero(uid, heroId) if hero == nil { return pb.ErrorCode_HeroNoExist } hero.EquipID = equipIds return pb.ErrorCode_Success } //指定英雄升级 func (this *ModelHero) levelUp(uid string, heroId int32) error { var heroes []*pb.DB_HeroData err := this.moduleHero.model_hero.GetList(uid, heroes) if err != nil { log.Errorf("levelUp err:%v", err) return err } return nil } //升星 func (this *ModelHero) starUp() { } //属性计算 - 暂时放在modelHero里实现 //英雄基础属性 + 英雄等级基础属性 * 英雄成长系数 + 英雄星级对应等级属性 * 英雄品质系数 func (this *ModelHero) PropertyCompute(uid, heroId string) map[int32]int32 { hero := this.getOneHero(uid, heroId) if hero == nil { return nil } //英雄等级基础属性levelup heroLvCfg := this.moduleHero.configure_comp.GetHeroLv(hero.Lv) if heroLvCfg == nil { return nil } //英雄基础配置 newhero heroCfg := this.moduleHero.configure_comp.GetHero(hero.HeroID) if heroCfg == nil { return nil } //品质系数 stargrowCfg := this.moduleHero.configure_comp.GetHeroStar(heroCfg.Star) if stargrowCfg == nil { return nil } //英雄星级对应等级属性 heroStarCfg := this.moduleHero.configure_comp.GetHeroLv(stargrowCfg.Level) if heroStarCfg == nil { return nil } //成长系数 lvGrow := this.moduleHero.configure_comp.GetHeroLvgrow(hero.HeroID) if lvGrow == nil { return nil } exprHp := fmt.Sprintf("%v + %v * %v/1000 + %v * %v", lvGrow.Hp, heroLvCfg.Hp, lvGrow.Hpgrow, heroStarCfg.Hp, stargrowCfg.StarupHp) hp, _ := mengine.ParseAndExec(exprHp) exprAtk := fmt.Sprintf("%v +%v * %v/1000 + %v * %v", lvGrow.Atk, heroLvCfg.Atk, lvGrow.Atkgrow, heroStarCfg.Atk, stargrowCfg.StarupAtk) atk, _ := mengine.ParseAndExec(exprAtk) exprDef := fmt.Sprintf("%v +%v * %v/1000 + %v * %v", lvGrow.Def, heroLvCfg.Def, lvGrow.Defgrow, heroStarCfg.Def, stargrowCfg.StarupDef) def, _ := mengine.ParseAndExec(exprDef) return map[int32]int32{ comm.PropertyHp: int32(math.Floor(hp)), comm.PropertyAtk: int32(math.Floor(atk)), comm.PropertyDef: int32(math.Floor(def)), } }