package orchard import ( "active/constant" "active/tools" "encoding/json" "fmt" "git.jiaxianghudong.com/go/logs" "git.jiaxianghudong.com/webs/pkg/rds" "math/rand" "strconv" "time" ) var OrchardConf OrchardConfig var OrchardCopy OrchardConfig type OrchardConfig struct { DurationWash int `json:"duration_wash" yaml:"duration_wash"` DurationTime time.Duration `json:"duration_time" yaml:"duration_time"` FreeWashLimit int64 `json:"free_wash_limit" yaml:"free_wash_limit"` StealFruit int64 `json:"steal_fruit" yaml:"steal_fruit"` DeclineRate int64 `json:"decline_rate" yaml:"decline_rate"` DeclineMaxExp int64 `json:"decline_max_exp" yaml:"decline_max_exp"` StealPer int64 `json:"steal_per" yaml:"steal_per"` OpenDuration time.Duration `json:"open_duration" yaml:"open_duration"` Limit int `json:"limit" yaml:"limit"` TreeVersion string `json:"tree_version" yaml:"tree_version"` StoreVersion string `json:"store_version" yaml:"store_version"` TreeList []OrchardTrees `json:"tree_list" yaml:"tree_list"` //树的概率配置 WashList []WashItem `json:"wash_list" yaml:"wash_list"` //施肥 的配置 Multiple []int64 `json:"multiple" yaml:"multiple"` // 倍数配置 BlessingList []Blessing `json:"blessing_list" yaml:"blessing_list"` //祈福道具列表 StoreList []OrchardStore `json:"store_list" yaml:"store_list"` WaterLimit int `json:"water_limit" yaml:"water_limit"` } type OrchardTrees struct { Level int64 `json:"level" yaml:"level"` Exp int64 `json:"exp" yaml:"exp"` MaxFruit int64 `json:"max_fruit" yaml:"max_fruit"` BasicProduct int64 `json:"basic_product" yaml:"basic_product"` Common int64 `json:"common" yaml:"common"` Middle int64 `json:"middle" yaml:"middle"` High int64 `json:"high" yaml:"high"` Super int64 `json:"super" yaml:"super"` ShowOutput int64 `json:"show_output" yaml:"show_output"` } type WashItem struct { Type int64 `json:"type" yaml:"type"` // 1:井水,2:圣水,3:泉水,4:清水 CostBean int64 `json:"cost_bean" yaml:"cost_bean"` Exp int64 `json:"exp" yaml:"exp"` RemainTimes int64 `json:"remain_times" yaml:"remain_times"` //剩余次数 TimeStamp int64 `json:"time_stamp"` //时间戳 Countdown int64 `json:"countdown"` //剩余时间 WaterTimes int64 `json:"water_times" yaml:"water_times"` //施肥 剩余次数 } type Blessing struct { Type int64 `json:"type" yaml:"type"` CostDiamond int64 `json:"cost_diamond" yaml:"cost_diamond"` UpdatedRate int64 `json:"updated_rate" yaml:"updated_rate"` Duration int64 `json:"duration" yaml:"duration"` } type OrchardFruit struct { Id int64 `json:"id" sql:"id"` UserId int64 `json:"user_id" sql:"user_id"` //用户id Number int64 `json:"number" sql:"number"` //果实数量 CreateTime int64 `json:"create_time" sql:"create_time"` //创建时间 OpenTime int64 `json:"open_time" sql:"open_time"` //结果时间 Level int64 `json:"level" sql:"level"` //果实等级 IsSteal int64 `json:"number_total" sql:"is_steal" gorm:"column:is_steal"` //果实总数 IsAccelerate int64 `json:"is_accelerate" sql:"is_accelerate"` //是否加速 IsIncrease int64 `json:"is_increase" sql:"is_increase"` //是否加产 StealUserId int64 `json:"-" gorm:"steal_user_id"` //偷东西的id StealNumber int64 `json:"steal_number" gorm:"steal_number"` //偷东西数量 RemainTime int64 `json:"remain_time" gorm:"-"` CanSteal bool `json:"can_steal" gorm:"-"` StealMsg []struct { UserId int64 `json:"user_id"` Number int64 `json:"number"` } `json:"steal_msg" gorm:"-"` //偷数量 StealJson string `json:"-" gorm:"steal_json"` } type OrchardTree struct { Id int64 `json:"id" sql:"id" gorm:"id"` UserId int64 `json:"user_id" sql:"user_id" gorm:"user_id"` //用户id Login string `json:"login" sql:"login" ` //LoginTime time.Time `json:"login_time" gorm:"login_time"` //登录时间 Level int64 `json:"level" sql:"level" gorm:"level"` //树等级 Exp int64 `json:"exp" sql:"exp" gorm:"exp"` Number int64 `json:"number" sql:"number" gorm:"number"` //果实数量 OpenTime int64 `json:"open_time" sql:"open_time" gorm:"open_time"` //结果时间 CreateTime int64 `json:"create_time" sql:"create_time" gorm:"create_time"` //结果时间 MaxFruit int64 `json:"max_fruit" sql:"max_fruit" gorm:"max_fruit"` //最大果数 NextLevelExp int64 `json:"next_level_exp" sql:"next_level_exp" gorm:"-"` //下一级的经验 WealthGod int64 `json:"wealth_god"` //财神 Laojun int64 `json:"laojun"` // 太上老君 LuckyCat int64 `json:"lucky_cat"` //幸运神 } type TreeMini struct { UserId int64 `json:"user_id" sql:"user_id" gorm:"user_id"` //用户id Level int64 `json:"level" sql:"level" gorm:"level"` //树等级 } func (this TreeMini) TableName() string { return "orchard_tree_tmp" } func (t *TreeMini) List(limit int, offset int) (list []*TreeMini) { db := tools.NewConn(MysqlExtDb) db.Where("user_id >=10000").Order("user_id").Limit(limit).Offset(offset).Find(&list) return } func (this OrchardTree) TableName() string { return "orchard_tree" } func (this OrchardFruit) TableName() string { return "orchard_fruit" } func (this *OrchardConfig) GetConf() { tools.ReloadYaml("orchard.yaml", this) tools.ReloadYaml("orchard.yaml", &OrchardCopy) //var exp int64 = 0 for i := range this.TreeList { this.TreeList[i].Middle += this.TreeList[i].Common this.TreeList[i].High += this.TreeList[i].Middle this.TreeList[i].Super += this.TreeList[i].High //exp += this.TreeList[i].Exp //this.TreeList[i].Exp = exp } //fmt.Printf("处理后数据 %+v \n", this) } type OrchardUserInfo struct { OrchardTree OrchardTree `json:"orchard_tree" yaml:"OrchardTree"` FruitList []OrchardFruit `json:"fruit_list"` CanSteal bool `json:"can_steal"` } type OrchardUserDay struct { StealNumber int64 `json:"steal_number" yaml:"steal_number"` //偷取果实数量 DurationTimeStamp []int64 `json:"duration_time_stamp" yaml:"duration_time_stamp"` //持续时间 Countdowns []int64 `json:"countdowns"` //倒计时 WaterRemainTimes []int64 `json:"water_remain_times" yaml:"water_remain_times"` //施肥 剩余次数 WaterUserList []string `json:"water_user_list"` //用户施肥 列表 StealUserList []string `json:"steal_user_list"` //偷取列表 Login bool `json:"login" yaml:"login"` } //获得树的缓存 func (this *OrchardUserInfo) GetData(userID string) error { db := tools.NewConn(MysqlExtDb) //data := rds.Redis.Get(fmt.Sprintf(constant.ORCHARDATA, userID)).Val() data := "" if data != "" { err := json.Unmarshal([]byte(data), this) if this.OrchardTree.Level != 0 { this.OrchardTree.Number = OrchardConf.TreeList[this.OrchardTree.Level-1].BasicProduct } else { this.OrchardTree.Number = OrchardConf.TreeList[0].BasicProduct } if err != nil { logs.Errorf("redpacket[%s] GetInviteBeanData json err:%v", userID, err) return err } } else { if this.OrchardTree.FindOne(userID) != nil { timeNow := time.Now() openTime := timeNow.Add(OrchardConf.OpenDuration).Unix() this.OrchardTree.CreateTime = timeNow.Unix() this.OrchardTree.OpenTime = openTime this.OrchardTree.UserId, _ = strconv.ParseInt(userID, 10, 64) //this.OrchardTree.CurrentFruit = 1 this.OrchardTree.Login = timeNow.Format("2006-01-02") this.OrchardTree.Level = 1 this.OrchardTree.MaxFruit = OrchardConf.TreeList[this.OrchardTree.Level-1].MaxFruit this.OrchardTree.NextLevelExp = OrchardConf.TreeList[this.OrchardTree.Level-1].Exp if err := this.OrchardTree.Insert(db); err != nil { return err } orchardFruit := OrchardFruit{ CreateTime: time.Now().Unix(), OpenTime: time.Now().Unix(), } orchardFruit.UserId, _ = strconv.ParseInt(userID, 10, 64) //生成个果实 fruitLevel := randFruitLevel(1) orchardFruit.OpenTime = time.Now().Unix() orchardFruit.CreateTime = time.Now().Unix() orchardFruit.Level = int64(fruitLevel) orchardFruit.Number = OrchardConf.TreeList[0].BasicProduct orchardFruit.RemainTime = openTime - timeNow.Unix() orchardFruit.IsSteal = orchardFruit.Number //插入果实 if err := orchardFruit.Insert(db); err != nil { return err } this.FruitList = append(this.FruitList, orchardFruit) //创建一个果实 } this.OrchardTree.Number = OrchardConf.TreeList[this.OrchardTree.Level-1].BasicProduct this.FruitList, _ = FindOrchardFruitAll(userID) for i := range this.FruitList { if this.FruitList[i].StealMsg == nil { this.FruitList[i].StealMsg = make([]struct { UserId int64 `json:"user_id"` Number int64 `json:"number"` }, 0) } } } this.CanSteal = false for i := range this.FruitList { if this.FruitList[i].OpenTime == 0 { this.FruitList[i].RemainTime = -1 } else if time.Now().Unix() > this.FruitList[i].OpenTime { this.FruitList[i].RemainTime = 0 } else { this.FruitList[i].RemainTime = this.FruitList[i].OpenTime - time.Now().Unix() } if time.Now().Unix() >= this.FruitList[i].OpenTime && this.FruitList[i].IsSteal == 0 { this.CanSteal = true } } return nil } func ReloadDataOrchardUserInfo(userId string) error { rds.Redis.Del(fmt.Sprintf(constant.ORCHARDATA, userId)) var orchardUserInfo OrchardUserInfo orchardUserInfo.GetData(userId) return nil } //设置树的缓存 func (this *OrchardUserInfo) SetData(userID string) bool { data, _ := json.Marshal(this) rds.Redis.Set(fmt.Sprintf(constant.ORCHARDATA, userID), string(data), 30*60*time.Second) return true } // func randFruitLevel(treeLevel int) int { tree := &OrchardConf.TreeList[treeLevel-1] r := rand.New(rand.NewSource(time.Now().UnixNano())) number := int64(r.Uint64() % 100) if number < tree.Common { return 1 } else if number < tree.Middle { return 2 } else if number < tree.High { return 3 } else { return 4 } } func RandFruit(treeLevel int, userId int64, Laojun int64, wealthGod int64) *OrchardFruit { var accelerate time.Duration = 100 var isAccelerate int64 = 0 var isIncrease int64 = 0 openTime := time.Now().Add(OrchardConf.OpenDuration / 100 * accelerate).Unix() orchardFruit := &OrchardFruit{ CreateTime: time.Now().Unix(), OpenTime: openTime, IsAccelerate: isAccelerate, IsIncrease: isIncrease, } orchardFruit.UserId = userId //生成个果实 fruitLevel := 1 orchardFruit.Level = int64(treeLevel) orchardFruit.OpenTime = openTime orchardFruit.CreateTime = time.Now().Unix() orchardFruit.Level = int64(fruitLevel) orchardFruit.Number = OrchardConf.TreeList[treeLevel-1].BasicProduct orchardFruit.RemainTime = openTime - time.Now().Unix() orchardFruit.IsSteal = orchardFruit.Number return orchardFruit }