/* 模块名:Troll 描述:巨怪商队 开发:梅雄风 */ package troll import ( "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/modules" "go_dreamfactory/pb" "time" ) type Troll struct { modules.ModuleBase modelTroll *modelTroll api *apiComp configure *configureComp } func NewModule() core.IModule { return &Troll{} } func (this *Troll) GetType() core.M_Modules { return comm.ModuleTroll } func (this *Troll) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) { err = this.ModuleBase.Init(service, module, options) return } func (this *Troll) OnInstallComp() { this.ModuleBase.OnInstallComp() this.api = this.RegisterComp(new(apiComp)).(*apiComp) this.modelTroll = this.RegisterComp(new(modelTroll)).(*modelTroll) this.configure = this.RegisterComp(new(configureComp)).(*configureComp) } // 接口信息 func (this *Troll) ModifyTrollData(uid string, data map[string]interface{}) (code pb.ErrorCode) { err := this.modelTroll.modifyTrollDataByObjId(uid, data) if err != nil { code = pb.ErrorCode_DBError } return } func (this *Troll) TrollAI(session comm.IUserSession, troll *pb.DBTrollTrain, aiCount int32) (code pb.ErrorCode) { var ( t int64 // 上一次刷新的时间 sellPrice map[int32]int32 // 出售货物价格 totalGold int32 pos int32 ) if troll.Buy != 0 && troll.Sell != 0 { return } sellPrice = make(map[int32]int32) t = troll.RefreshTime now := time.Now().Unix() trainNum := this.configure.GetTrollMaxTraintNum() maxCoefficient := this.configure.GetTrollMaxCoefficientNux() // 增长幅度的最大值 if maxCoefficient == 0 { code = pb.ErrorCode_ConfigNoFound return } goods := this.configure.GetTrollAllGoods() for _, v := range goods { sellPrice[v.Id] = v.Goodsprice } sz := this.configure.GetTrollAllTrain() if len(sz) == 0 { return } iCount := this.configure.GetTrollRule(comm.TrollSurprise) for { pos++ if pos > iCount { break } index := int32(pos) % trainNum if int32(len(sz)) <= index { break } t += int64(sz[index]) if now < t { troll.RangeId++ troll.TarinPos++ troll.RangeId = (troll.RangeId % maxCoefficient) + 1 troll.TarinPos = (troll.TarinPos % trainNum) + 1 coefficient := this.configure.GetTrollCoefficient(troll.RangeId) if coefficient == nil { return } if troll.Sell >= coefficient.Coefficient { // 可以出售 for _, v := range goods { sellPrice[v.Id] = v.Goodsprice * coefficient.Coefficient } totalGold += this.SellAllItem(troll, sellPrice) troll.AiCount++ if troll.AiCount > aiCount { //达到最大交易次数 troll.RefreshTime = t // 设置上次刷新的时间 break } } if troll.Buy >= coefficient.Coefficient { // 可以购买 for _, v := range goods { sellPrice[v.Id] = v.Goodsprice * coefficient.Coefficient } troll.Shop = make(map[int32]int32) // 买之前清除购买上限 totalGold += this.BuyAllItem(session.GetUserId(), troll, sellPrice) } } else { // 超过当前时间 troll.RefreshTime = t break } } this.ModuleUser.AddAttributeValue(session, comm.ResGold, totalGold, true) return } // 出售所有货物 func (this *Troll) SellAllItem(troll *pb.DBTrollTrain, price map[int32]int32) (gold int32) { for k, v := range troll.Items { if _, ok := price[k]; ok { gold += price[k] * v } delete(troll.Items, k) // 清除数据 } return } // 可以购买商品 func (this *Troll) BuyAllItem(uid string, troll *pb.DBTrollTrain, price map[int32]int32) (gold int32) { var ( box map[int32]int32 // 盒子 存放可购买的物品 leftGirdNum int32 // 剩余可购买格子数量 costGold int32 ) maxGirdNum := this.configure.GetTrollRule(comm.TrollGridCount) // 获取背包最大格子数量 maxgoods := this.configure.GetTrollRule(comm.TrollItemCount) // 获取单个物品最大上限 20个 leftGirdNum = maxGirdNum - troll.GridNum box = make(map[int32]int32, 0) goods := this.configure.GetTrollAllGoods() for _, v := range goods { if leftGirdNum > 0 && troll.Shop[v.Id] < v.Max { leftGirdNum-- troll.Items[v.Id] += maxgoods troll.Shop[v.Id] += maxgoods box[v.Id] += maxgoods // 加入篮子 } // 检查该位置的格子没有补满 full := (troll.Items[v.Id] + box[v.Id]) % maxgoods if full != 0 { box[v.Id] += (maxgoods - full) // 格子补满 } } // 通过金币来校验哪些物品可以买 curGold := this.ModuleUser.QueryAttributeValue(uid, comm.ResGold) for k, v := range box { for i := 0; i < int(v); i++ { //0 1 2 3 curGold -= int64(price[k]) costGold -= price[k] if curGold < 0 { box[k] = int32(i) costGold += price[k] // 返还之前扣的 break } } } troll.Items = box gold = costGold return }