当前位置: 首页 > news >正文

心情值游戏系统实现

一、心情值结构开放添加

1、添加附加在Role上Mood心情值系统

2、增加配置中所有有关mood心情值的登陆Mood结构初始化,buff校验,心情值门槛判定,心情值结构返回以及通过配置的心情值变化事件等供服务调用的标准方法

// 供心情值变化事件调用 func (mgr *RoleMgr) addMoodByEvent(ctx *GameContext, triggerType pb.MoodTriggerType, value int32) (*pb.MoodEvent, MoodValueChange, int32) { eventId := int32(triggerType) c := ctx.config.TbMood.Get(eventId) if c == nil || value == 0 { log.Warn("event not exist or value zero", log.Int32("eventId", eventId), log.Int32("value", value)) return nil, MoodValueChange{}, 0 } if c.Value >= 0 && mgr.mood.Value >= ctx.config.TbGlobalConfig.Get().MaxMoodValue { return nil, MoodValueChange{}, 0 } if c.Value < 0 && mgr.mood.Value <= 0 { return nil, MoodValueChange{}, 0 } player := mgr.player now := player.NowUnix() event, exist := mgr.mood.Events[eventId] if !exist { event = &pb.MoodEvent{ Id: eventId, } } count := value if c.PerTimes > 0 { total := event.RestValue + value count = total / c.PerTimes if c.StoreRest { event.RestValue = total % c.PerTimes } } if count == 0 { if c.StoreRest { mgr.setMoodEvent(event) } return nil, MoodValueChange{}, 0 } if c.DailyLimit != 0 { if event.Count >= c.DailyLimit { ctx.Debug("mood daily limit", log.Int32("eventId", eventId)) return nil, MoodValueChange{}, 0 } if event.Count+count > c.DailyLimit { count = c.DailyLimit - event.Count } } if c.AddCd != 0 { if event.LastTime > 0 && event.LastTime+int64(c.AddCd) > now { ctx.Debug("mood event in cd ", log.Int32("eventId", eventId)) return nil, MoodValueChange{}, 0 } } event.Count += count event.LastTime = now if c.AddCd != 0 { event.NextAddTime = now + int64(c.AddCd) } else { event.NextAddTime = 0 } changeValue := c.Value * count change := mgr.changeMoodValue(ctx, changeValue) mgr.player.TdaLogMoodChange(ctx, eventId, change.ChangeValue) mgr.setMoodEvent(event) ctx.Debug("mood event happened", log.Any("event", event), log.Int32("current mood value", mgr.mood.Value), log.Int32("change value", changeValue)) return event, change, c.Priority }
// CheckMoodGateForBuff 校验指定心情值是否能使用对应的 buffEffect。 func (mgr *RoleMgr) CheckMoodGateForBuff(ctx *GameContext, mood int32, buffEffect pb.MoodBuffEffectType) MoodGateCheckResult { requiredMoodL, requiredMoodR := mgr.getRangeMoodValueWithoutBuffEffect(ctx, buffEffect) var result MoodGateCheckResult if !mgr.IsMoodSystemOpen(ctx) { result.Status = pb.StatusCode_StatusCode_MOOD_SYSTEM_NOT_OPEN return result } if requiredMoodR == 0 { // 配置表中没有定义不含该 buffEffect 的有效心情区间(配置缺失或该 buff 覆盖所有阶段) result = MoodGateCheckResult{ RequiredMood: -2, Shortfall: 0, } } else if mood >= requiredMoodL && mood <= requiredMoodR { result = MoodGateCheckResult{ RequiredMood: -1, Shortfall: 0, } } else if mood < requiredMoodL { result = MoodGateCheckResult{ RequiredMood: requiredMoodL, Shortfall: requiredMoodL - mood, } } else { result = MoodGateCheckResult{ RequiredMood: requiredMoodR, Shortfall: requiredMoodR - mood, } } if result.RequiredMood == -1 { result.Status = pb.StatusCode_StatusCode_OK } else if result.RequiredMood == -2 { result.Status = pb.StatusCode_StatusCode_CFG_NOT_FOUND } else { result.Status = pb.StatusCode_StatusCode_MOOD_NOT_ENOUGH } return result }

3、Mood心情值系统开启(定时器校验Mood系统的开启的Condition是否满足后判断是否开启)

// IsMoodSystemOpen 检测是否开启心情系统,当条件满足时进行初始化并标记 func (mgr *RoleMgr) IsMoodSystemOpen(ctx *GameContext) bool { if mgr.moodOpenNoticeSent { return true } mgr.CheckIsInit(ctx) return mgr.moodOpenNoticeSent }
func (mgr *RoleMgr) SlowTick(ctx *GameContext, playerNowUnixMilli int64) bool { execute := false nowUnix := playerNowUnixMilli / 1000 mgr.checkMoodData(ctx, nowUnix, false) if mgr.AddMoodByEvent(ctx, pb.MoodTriggerType_MoodTriggerType_Offline_Deacy, 1) { execute = true } if mgr.checkPawnData(ctx) { execute = true } if mgr.checkPawnRoleInfoDirty(ctx) { execute = true } return execute }

定时器做mgr.AddMoodByEvent(ctx, pb.MoodTriggerType_MoodTriggerType_Offline_Deacy, 1)
心情值时间衰减的任务,任务中调用IsMoodSystemOpen判断并初始化。

二、统一接口调用、埋点、信息推送

1、接口调用(直接调)

2、moodbuff影响点埋点
埋点接口

//供调用 func (mgr *RoleMgr) MoodBuffEffect(ctx *GameContext, buffId int32) { if buffId > 0 { mgr.player.TdaLogMoodBuffEffect(ctx, buffId) } } //写入日志 func (player *Player) TdaLogMoodBuffEffect(ctx *GameContext, buffId int32) { distinctId := player.getTdaDistinctId() if distinctId == "" { ctx.Debug("distinctId == nil") return } headerLength := player.fillTdaEventCommLogHeader(ctx) eventProperties := make(map[string]any, headerLength+2) eventProperties[td.TlpBuffId] = buffId player.server.tdaLogRecorder.Track(td.TdaLogMoodBuffEffect, player.analysisAccountId, distinctId, util.MergeMap(eventProperties, player.getTdaEventCommLogHeader())) }

Mood影响蓝图奖励埋点

3、Mood系统开启信息推送

// NotifyMoodOpenIfNeeded 通知玩家心情系统已开启。 func (mgr *RoleMgr) NotifyMoodOpenIfNeeded(ctx *GameContext) { mgr.player.Send(&pb.OpenFunctionNotice{ Status: pb.StatusCode_StatusCode_OK, OpenFunctions: []pb.FunctionType{pb.FunctionType_FunctionType_MOOD}, }) }

三、功能测试,埋点日志检测

http://www.jsqmd.com/news/1106285/

相关文章:

  • [特殊字符] 搬砖的秘密:为什么一次搬 64 块砖最快?
  • 车间地坪养护秘籍
  • Rust项目开发完整教程
  • 从WAIC看AI办公新趋势:会议助手正在从“记录工具”变成“组织智能体”
  • Rust语言基础开发教程
  • 一个老股民的十年自白十年炒股没亏,但我劝你别学我
  • 本地化AI漫剧制作:Qwen与ComfyUI实战指南
  • 从 VMware 迁移到 Proxmox VE 的完整方案
  • MAX9744与PIC18LF45K50的音频功率放大系统设计
  • Vue组件开发技巧
  • 单系统登录机制
  • vim源码编译安装 _
  • 贵阳婚纱照拍的最好的是哪一家?
  • view_source
  • 大气层系统完整指南:5个步骤快速安装Switch自定义固件
  • [特殊字符]️ 性能调优手册:把 chunk size 思路落地到你的项目
  • 出现“WSL 安装似乎已损坏”的错误通常意味着Windows子系统对于Linux(WSL)的某些组件可能未正确安装或注册。要解决这个问题,你可以尝试以
  • 【课程设计/毕业设计】基于 Java Web 的乡村茶产业文化传播平台的设计与实现【附源码、数据库、万字文档】
  • Go语言并发模式之WorkerPool设计实践
  • Java接口开发最佳实践
  • 可变系数的脉冲压缩
  • 2026年大模型API选型指南:六大聚合平台多维度实测与避坑建议
  • [Saturate节点]原理解析与实际应用
  • 终极图片浏览神器:ImageGlass完整指南,轻松查看90+图片格式
  • 在线游戏反作弊技术:从原理到实战应用
  • Gogs 轻量级 Git 服务器搭建与使用
  • 【新品发布】AI PC快充防护再进阶!艾为电子推出Type‑C OVP系列产品
  • Harness Engineering 实践案例:如何Agent 写一份行为规范
  • 电流环PI参数自整定及时域频域分析
  • Python高级异步编程实战技巧与最佳实践