RPG - 存储半复杂树结构的玩家数据

2024-02-16

我正在 js 中制作一个 web RPG,使用 melon JS 和 SQL DB 以及 PHP。这个问题是关于如何存储每个非玩家角色 (NPC) 的已完成任务和当前任务。

NPC对话和任务数据:所有对话框都存储在一个js对象中,结构如下:

var dialog = {
    quests : {
        quest1 : {  
            NPCName ("Joe"): {
                TaskName ("1 - Introductions") :  {
                     "english" : 
                      [
                          "Hello, here is some dialog",
                          "More dialog..." (stored in array so I can cycle through it)
                      ],//more items per task
                }, //more tasks per NPC
            }, //more NPCs per quest
        }, //more quests options per "quests"
    }, //more options in dialog besides "quests" if I want
};

I'm not将所有地图对话框存储在同一个文件中,因为该文件会变得太混乱......所以相反:当地图更改时,我使用js_require加载到一个新的js带有一组新对话框的文件:

loadNpcDialog : function (dialogNumber) {
    require(["./dialog/npc_dialog_level_" + dialogNumber + ".js"], function(dialog) {
    });     
},

任务编号:当创建一个新的 NPC 时(类game.NPCEntity),我为每个 NPC 实例创建一个局部变量,名为taskNum,设置为 0。当他们完成任务时,我只需访问并递增该 NPC 的任务编号:

    game.player = me.game.getEntityByName(game.data.currNPC)[0];
    game.player.taskNum++;

对于这款RPG,我想要实现以下目标:

  • GTA 风格的免费世界任务队列:等级进展、任务进展和每个 NPC 任务的进展是线性的(完成第 1 级进入第 2 级等),但对于每个任务,都会生成一组 NPC...(你可以将它们视为子任务),每个包含 1 到 n 个任务。我想建立任务队列的灵活性,允许玩家以任何顺序与任何生成的 NPC 对话...并按线性顺序完成任务(任务 1,然后 2,然后 3...)。这就像 GTA 风格,因为整个游戏遵循线性进展,但让你可以通过与世界上的随机人交谈来灵活地开始任何你想要的任务。

  • 游戏数据:游戏应该存储当前的and每个登录玩家 ID 的已完成关卡、每个关卡的任务名称、每个任务的 npc 名称以及每个 npc 名称的任务。它应该加载以下树(红色=完成):

我的问题

  • 当游戏加载时,它应该记住我在上面的树中提到的那些事情。我已经设置了数据库来加载级别和任务信息(我只是从数据库返回当前级别和任务编号,然后循环遍历NPC dialog上面显示的结构将值存储在currentAndCompleteLevels and currentAndCompleteQuests数组直到循环到达当前级别和来自DB的任务编号)...以及玩家的坐标和经验...

然而,由于我允许玩家随时开始、暂停、然后恢复任何 NPC 任务列表,所以我无法真正添加npc completed num and tasks completed num列到数据库。这是因为我无法循环NPC dialog结构和负载的方式与我相同level and quest信息,因为你完成 NPC 任务的顺序是非线性。我必须以某种方式跟踪每个 NPC 已完成的任务数。我怎样才能做到这一点?

我正在考虑创建一个新的NPCData表存储游戏中所有NPC,然后存储current task num对于那个 NPC...但是我必须为登录我游戏的任何新玩家创建一个新条目。

或者也许创建两个数据库列用户统计信息 table, currNPC and currTask,然后循环遍历存储每个 NPC 的所有任务的关联数组?但随后我需要为每个已完成的 NPC 以及每个 NPC 已完成的任务创建一个列。哎哟,我头晕了。

当前数据库架构:


我想这是用户和任务之间的经典多对多数据库关系,在这种情况下我建议创建一个关系表usertasks。我在这里存储外键:id_user, levelnum, questnum.

我还要补充一下:

  • npcnum这是该任务的 NPC ID,并且
  • tasknum这是完成的任务数。

因此,“子任务”实际上是由levelnum,questnum and npcnum我们可以将其与用户联系起来id_user.

因此您可以加载为加入任务而完成的任务levelnum and questnum从 userstats 获取用户当前时间点每个任务完成的任务。

这是建议的关系表的 SQLfiddle。

http://sqlfiddle.com/#!2/edea9/1 http://sqlfiddle.com/#!2/edea9/1

假设您只需要在内存中保存当前的子任务,我们可以用一个数字数组来存储进度,假设:levelnum and questnum永远是“当前”的。

var tasks=[];
function progress_task(npcNum){
  tasks[npcNum] = tasks[npcNum] ? tasks[npcNum]+1 : 1;
}
function get_task(npcNum){
  return tasks[npcNum] || 0;
}

var currNPC=1;
progress_task(currNpc);   

拥有用户任务的注意事项是,您将拥有较旧的任务和级别的条目,并且您最终会担心有一个NPCData类型表与子任务*用户行数。如果这感觉很混乱,那么另一个选择也许只是转换 javscript 变量tasks到 JSON 并存储它,加载时再次加载它userstats这也许是更简单的路线。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RPG - 存储半复杂树结构的玩家数据 的相关文章

  • 最佳实践:在 PHP 中导入 mySQL 文件;分割查询

    我遇到了一种情况 我必须更新共享托管提供商上的网站 该网站有一个 CMS 使用 FTP 上传 CMS 文件非常简单 我还必须导入一个大的 相对于 PHP 脚本的范围 数据库文件 未压缩时大约 2 3 MB Mysql 已关闭 无法从外部访问
  • 如何使用 Promise.all 获取 URL 数组?

    如果我有一个 url 数组 var urls 1 txt 2 txt 3 txt these text files contain one two three respectively 我想构建一个如下所示的对象 var text one
  • 同步不同数据库的2个表-MySQL

    我在数据库表中有一个包含某些医疗信息的表 我每天抓取并解析它们并将其存储在本地数据库的表中 假设最初有 1500 条记录 今天我的本地计算机上又添加了 100 条记录 现在 我有一个服务器 我需要在其中推送这些记录 因此数据库是不同的 我昨
  • 为什么 Chrome 中存在 Document.prototype.getElementsByName?

    我所知 getElementsByName是一个定义在中的函数HTMLDocument and HTMLDocument继承自Document and Document继承自Node 那为什么我能看到Document prototype g
  • 将 Null 与 MySQL 触发器中的另一个值进行比较

    所以这是我的问题 我在更新表行时比较新值和旧值 但新值或旧值有时会为空 所以下面的代码不起作用 我可以解决这个问题吗 谢谢 BEFORE UPDATE ON mytable FOR EACH ROW BEGIN IF OLD assigne
  • 随机字体颜色

    我需要用 2 或 3 种随机颜色为文本着色 我如何在 PHP 或 JavaScript 中执行此操作 color str pad sprintf x x x rand 0 255 rand 0 255 rand 0 255 6 rand 0
  • Vue SPA - 如何在浏览器中呈现时隐藏 .vue 文件

    我正在开发一个用 Vue js 开发的单页应用程序 托管在 Node js 服务器上 目前它仍在开发中 但最终将暴露给外部客户 并且由于我们将处理敏感数据 我们希望避免在用户检查元素时看到 vue 文件和相对文件树结构在开发工具中 See
  • 在tinymce 4中裁剪后上传图像

    我正在开发tinymce 并且已经实现了imagetools 现在 当图像插入到文本编辑器中 然后我编辑 裁剪图像时 它将图像 src 更改为类似的内容blob www localhost asdf ghij 我想要的是裁剪后我可以将此 u
  • 跨数据库管理系统检查字符串是否为数字的方法

    好的 我有这个字段 code varchar 255 它包含我们导出例程中使用的一些值 例如 DB84 DB34 3567 3568 我需要仅选择自动生成的 全数字 字段 WHERE is numeric table code is num
  • 无法上传大于 8MB 的文件

    我正在尝试制作一个文件上传脚本 并且我已经为这个问题苦苦挣扎了一段时间 我已阅读并尝试了与此相关的所有答案 但无济于事 这是我在 php 中尝试过的 文件名 file uploads On upload max filesize 100M
  • React hooks 需要返回值吗?

    我最近开始在我的 React 应用程序中构建自定义挂钩 并一直在关注 React 网站上的文档 然而 我正在构建的钩子不需要返回值 因为它们在初始化时为 Redux 设置数据 Example custom hook export const
  • 将 blob 转换为 base64

    这是我想要执行的代码片段Blob to Base64 string 此注释部分有效 当由此生成的 URL 设置为 img src 时 它会显示图像 var blob items i getAsFile var URLObj window U
  • 如何将 ZF2 单元/应用程序模块测试合并到单个调用中?

    我遵循将测试存储在模块中的 ZF2 约定 并且当从每个模块内运行测试时一切正常 我想做的是有一个根级别的 phpunit xml 来调用各个模块测试并将它们合并以生成代码覆盖率数据和其他指标 问题是每个单独的测试套件都是在模块化 phpun
  • asp.net mvc - 如何在 javascript 中循环访问模型数据

    我试图用 javascript 将数据添加到列表框 但是字符串构建语法让我难住了 var yourobject 导致错误 字符文字中的字符太多 全部代码 var mlb cm createListBox mylistbox title My
  • 实现npm包自定义组件VueJS

    我正在尝试使用以下 npm package 来绕过 X frame 选项 https www npmjs com package x frame bypass https www npmjs com package x frame bypa
  • MYSQL sum() 计算不同的行

    我正在寻求在 SQL 查询中使用 sum 的帮助 SELECT links id count DISTINCT stats id as clicks count DISTINCT conversions id as conversions
  • 用php将数字转换为字母[重复]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中将数字 1 2 3 转换为字符串 一 二 三 https stackoverflow com questions 2112571 converting a number 1 2 3 to
  • 如何强制重新安装 React 组件?

    假设我有一个具有条件渲染的视图组件 render if this state employed return div div
  • Jquery 脚本可以在 JSfiddle 中运行,但不能在 html 页面上运行

    我创建了一个JSFiddle http jsfiddle net defjam64 w4sGZ 4 其按预期工作 Jquery script function icon hover gcp icon hover function gcp i
  • CodeIgniter 2.1.0 的会话库中是否存在任何已知错误?为什么我会被踢出去? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在开发

随机推荐

  • 每行上的模态按钮显示从数据库获取详细信息的模态

    我已经使用表从两个表中获取所有记录 效果很好 我在显示的每一行末尾添加了一个按钮Modal 在此模式中 我想根据每个行 ID 显示数据 我的代码有一个 while 循环 它显示表中的记录 在该 while 循环中 我又编写了一个 sql 语
  • 如何在使用 XMLHttpRequest() 时在 python 中接收 POST 数据

    我有两个关于使用 XMLHttpRequest 时接收数据的问题 客户端是用javascript编写的 服务器端是用python写的 如何在 python 端接收 处理数据 如何响应 HTTP 请求 客户端 var http new XML
  • powershell - 使用文件名列表删除文件

    我从堆栈溢出中得到了以下代码 它工作正常 TargetFolder Pathofyourfolder Files Get ChildItem TargetFolder Exclude gc List txt Recurse foreach
  • 使用 AJAX 观察 SQL 数据库的更改 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的数据库中有一个列将随机更新 每当该列更新时 我都需要刷新页面上的内容 如何使用 AJAX jQuery 仅对数据库更改执行操作 你
  • 错误您已经拥有该商品

    我有一个新的 Android 应用程序 其中添加了应用程序内计费功能 我感到沮丧得抓狂 我已上传签名的 APK 并发布到 alpha 我创建了一组应用内产品并将其全部激活 我创建了一个新的 Gmail 帐户 并将其定义为应用程序 apk 页
  • Java 中的架构约束 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想确保我的项目不包含包之间不必要的依赖关系 例如 我想确保该项目具有分层结构 IE 模型低于一切 业务
  • 从 HDC 句柄创建 QPaintDevice

    我有一个来自外部库的 Windows HDC 句柄 我想使用 QPainter 功能来绘图 Qt 中有什么方法可以从 HDC 句柄创建 QPaintDevice 吗 这样做的一种方法 使用 Windows API 从 HDC 获取 HWND
  • 使用 jQuery 操作 TinyMCE 内容

    使用 TinyMCE 我可以轻松操作内容并将其发送回编辑器 如下所示 get content from tinyMCE var content tinyMCE get content getContent manipulate conten
  • 使用 NSMutableString 追加到文件末尾

    我有一个日志文件 我试图将数据附加到其末尾 我有一个NSMutableString textToWrite变量 我正在执行以下操作 textToWrite writeToFile filepath atomically YES encodi
  • 从 ASP.NET MVC2 升级到 MVC3 的原因 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用此关键字并揭示模块模式的严格违规

    无法让以下内容通过 jslint jshint jshint strict true var myModule function use strict var privVar true pubVar false function privF
  • MFC/WinAPI 的大问题

    我需要创建一个带有两个选项卡的表单视图的 SDI 表单 其中封装了多个对话框作为选项卡内容 但表格必须有彩色背景 诸如此类的事情让我讨厌编程 首先 我通过资源编辑器尝试了 CTabControl 尝试了不同的事情 但未记录的行为和没有答案的
  • 使用多个自定义表模型避免重复代码

    我正在从事一个项目 其中我们有几个领域类来对业务数据进行建模 这些类是简单的 POJO 我必须使用它们来显示几个表 例如 考虑这个类 public class Customer private Long id private Date en
  • IntelliJ 中的“用 try...catch 换行”?

    我可以选择一段代码并让 IntelliJ 用 try catch 将其包装起来吗 有键盘快捷键吗 选择代码 然后 Choose Code gt Surround With 按 Ctrl Alt T 对于 OS X 命令 选项 T 有时我喜欢
  • 如何修复 Mountain Lion 中的 VIM 系统剪贴板使用问题

    set clipboard unnamed是我最喜欢的之一 vimrc配置 多亏了它 猛拉和删除被复制到我的系统剪贴板 我可以轻松地将它们粘贴到其他应用程序 然而 当我升级到 Mountain Lion 时 这个设置就崩溃了 你知道如何解决
  • 更改 JButtons 背景的最佳方法

    现在我使用以下方法更改按钮的背景颜色 button setBackground Color WHITE 这是一个例子 但是当我有一个巨大的 jbuttons 网格 1000 时 仅仅运行一个 for 循环来改变每个按钮的背景是非常非常慢的
  • Hibernate - TypedQuery.getResultList() 返回同一对象的列表

    这是对问题的更多也许更好的描述 我做了一个简单的选择查询 返回的列表包含确切数量的记录 对象 就像我在数据库中执行相同的查询一样 但问题是所有对象都是相同 相同的 例如 这是数据库中的结果 我删除了空值 26801 01 JAN 00 7
  • 构建 Windows 版 Linphone 时出错

    我正在尝试按照以下说明构建适用于 Windows 的 linphoneReadme mingw使用 MinGw Msys 在下载belle sip包之前没有任何问题 当我跑步时 autogen sh我收到以下错误 Generating bu
  • Ruby 多字符串替换

    str Hello World 预期输出是 Hello World 我可以做这个 str gsub gsub 有没有其他方法可以在单个函数调用中完成此操作 就像是 str gsub s1 s2 r1 r2 从 Ruby 1 9 2 开始 S
  • RPG - 存储半复杂树结构的玩家数据

    我正在 js 中制作一个 web RPG 使用 melon JS 和 SQL DB 以及 PHP 这个问题是关于如何存储每个非玩家角色 NPC 的已完成任务和当前任务 NPC对话和任务数据 所有对话框都存储在一个js对象中 结构如下 var