function.go 5.92 KB
package logic

import (
	"HttpServer/jsonconf"
	"HttpServer/redishandler"
	"common/logger"
	"common/redis"
	"encoding/json"
	"strconv"
	"time"
)

func SaveUserInfo(data *UserData, uniqueid string) error {

	savestr, err := json.Marshal(data)
	if err != nil {
		return err
	}

	err = redishandler.GetRedisClient().HSet(redis.USER_INFO__KEY, uniqueid, string(savestr))

	return err
}

func GetUserInfo(uid string) (*UserData, error) {

	data, err := redishandler.GetRedisClient().HGet(redis.USER_INFO__KEY, uid)
	if err != nil {
		return nil, err
	}
	var tmp UserData
	err = json.Unmarshal([]byte(data), &tmp)
	if err != nil {
		return nil, err
	}

	return &tmp, nil
}

//初始化玩家信息
func InitUserInfo(data *UserLoginReq, resp *UserLoginResp, uuid int) {
	udata := new(UserData)
	udata.Gold = 100000
	udata.GoldSum += udata.Gold
	udata.Love = 0
	udata.InviteId = data.Fromid
	udata.Highestlv = 0
	udata.CurBoxLv = 1
	udata.IsDouble = 0
	udata.IsAuto = 0
	udata.IsBoxAcc = 0
	udata.RandGiftDay = time.Now().Day()
	udata.RandGiftNum = 6
	udata.RandGiftTime = int(time.Now().Unix())
	udata.Redbag = 0
	udata.IsFirstRedBgCat = 0

	//初始化16个猫爬架
	for i := 0; i < 16; i++ {
		var d1 PosData
		d1.Pos = i
		d1.Catlv = 0
		udata.PosInfo = append(udata.PosInfo, d1)
		var d2 DataDesc
		d2.Pos = i
		d2.Catlv = 0

	}
	udata.Goldrate = 0
	udata.Loverate = 0

	//初始化商店信息
	initcatcfg := jsonconf.GetCatConfig(1)
	if initcatcfg == nil {
		logger.Error("get 1catcfg err")
		return
	}
	var info BuyCatInfoData
	info.Buytime = 0
	info.CurPrice, _ = strconv.ParseInt(initcatcfg.Price, 10, 64)
	info.IsMaxBuytime = 0
	udata.BuyCatInfo = append(udata.BuyCatInfo, info)

	//初始化猫咖门店数据
	udata.CatShopInfo.LeftTime = 0
	udata.CatShopInfo.Chapter = 1
	udata.CatShopInfo.DayNum = time.Now().Day()
	udata.CatShopInfo.IsPlaying = 0
	udata.CatShopInfo.PlayTimes = 0
	udata.CatShopInfo.Section = 1
	udata.CatShopInfo.ThisIsWatch = 0
	udata.CatShopInfo.TotalWatchNumLeft = 8 //

	logger.Info("Init user data=%v", udata)

	//保存redis
	SaveUserInfo(udata, strconv.Itoa(uuid))

	//初始化玩家仓库信息
	pware := new(UserWareHouseData)
	for i := 0; i < 15; i++ {
		var tmp WareHouseDesc
		tmp.Warelv = 0
		pware.Info = append(pware.Info, tmp)
	}
	wares, err := json.Marshal(pware)
	if err != nil {
		logger.Info("InitUserInfo warehouse failed err=%v", err)
	}
	redishandler.GetRedisClient().HSet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(uuid), string(wares))

	//保存此次计算时间
	nowtimestr := strconv.Itoa(int(time.Now().Unix()))
	redishandler.GetRedisClient().HSet(redis.USER_LAST_CALC_TIME, strconv.Itoa(uuid), nowtimestr)
}

//计算购买后猫箱子的位置,将箱子放到对应位置 返回值表示位置 -1表示失败都满了
func getCatPutPos(uinfo *UserData, clv int) int {
	pos := -1
	for k, v := range uinfo.PosInfo {
		if v.Catlv == 0 {
			uinfo.PosInfo[k].Catlv = clv
			uinfo.PosInfo[k].Pos = k
			//v.Catlv = clv
			//v.Pos = k
			pos = k
			break
		}
	}
	return pos
}

func (udata *UserData) CalcGoldRate() int64 {
	//计算出所有速率的和
	//计算方式为 首先计算合成界面猫的产出速率,然后计算红毛包的产出速率,最后计算仓库中的猫的产出速率
	var sumrate int64
	cfg37 := jsonconf.GetCatConfig(37)
	if cfg37 == nil {
		logger.Error("37cfg err!!")
		return 0
	}
	for _, v := range udata.PosInfo {
		if v.Catlv > 0 && v.Catlv < 100 {
			//有猫存在的要计算一下
			//非红包猫
			for _, vv := range jsonconf.GetJsonConf().CatConfig {
				if vv.Id == v.Catlv {
					onerate, _ := strconv.ParseInt(vv.Gold_get, 10, 64)
					sumrate += onerate
					break
				}
			}
		}

		if v.Catlv > 100 {
			//红包猫  需要判断是否产金币
			rcfg := jsonconf.GetRedCatConfig(v.Catlv)
			if rcfg != nil {
				if rcfg.Is_37 != 0 {
					onerate, _ := strconv.ParseInt(cfg37.Gold_get, 10, 64)
					sumrate += onerate
				}
			} else {
				logger.Error("GetRedCatConfig failed lv=%v", v.Catlv)
			}
		}
	}

	udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(udata.UserId))
	if err != nil {
		logger.Error("CalcGoldRate failed err=%v", err)
		return sumrate
	}
	wdata := new(UserWareHouseData)
	err = json.Unmarshal([]byte(udatastr), wdata)
	if err != nil {
		logger.Error("CalcGoldRate Unmarshal redis failed ")
		return sumrate
	}
	for _, v := range wdata.Info {
		rcfg := jsonconf.GetRedCatConfig(v.Warelv + 100)
		if rcfg != nil {
			if rcfg.Is_37 != 0 {
				onerate, _ := strconv.ParseInt(cfg37.Gold_get, 10, 64)
				sumrate += onerate
			}
		} else {
			logger.Error("GetRedCatConfig failed lv=%v", v.Warelv+100)
		}
	}

	return sumrate
}

//发生金币变动时保存排行榜
func (udata *UserData) AddToRank() error {
	err := redishandler.GetRedisClient().Zadd(redis.USER_GOLD_RANK, float64(udata.Gold), strconv.Itoa(udata.UserId))
	if err != nil {
		logger.Error("AddToRank failed err=%v", err)
	}
	return err
}

//计算最高等级猫的名字
func (u *UserData) CalcHigestCatName() string {
	higestlv := 0
	for _, val := range u.PosInfo {
		if higestlv < val.Catlv {
			higestlv = val.Catlv
		}
	}

	//计算仓库内的
	udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(u.UserId))
	if err != nil {
		logger.Error("CalcHigestCatName failed err=%v", err)
		return ""
	}
	wdata := new(UserWareHouseData)
	err = json.Unmarshal([]byte(udatastr), wdata)
	if err != nil {
		logger.Error("CalcHigestCatName Unmarshal redis failed ")
		return ""
	}
	for _, val := range wdata.Info {
		reallv := val.Warelv + 100
		if higestlv < reallv {
			higestlv = reallv
		}
	}

	//计算猫名字
	if higestlv > 100 {
		cfg := jsonconf.GetRedCatConfig(higestlv - 100)
		if cfg == nil {
			logger.Error("CalcHigestCatName failed getcfg higestlv=%v", higestlv)
			return ""
		}
		return cfg.Name
	} else {
		cfg := jsonconf.GetCatConfig(higestlv)
		if cfg == nil {
			logger.Error("CalcHigestCatName failed getcfg higestlv=%v", higestlv)
			return ""
		}
		return cfg.Name
	}

}