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

Javascript RPG-为半复杂树结构存储玩家数据,javascript,php,mysql,game-engine,melonjs,Javascript,Php,Mysql,Game Engine,Melonjs,我正在用js制作一个web RPG,在PHP中使用瓜js和SQL DB。这个问题是关于如何存储每个非玩家角色(NPC)的已完成任务和当前任务 NPC对话框和任务数据:所有对话框都以以下结构存储在js对象中: var dialog = { quests : { quest1 : { NPCName ("Joe"): { TaskName ("1 - Introductions") : {

我正在用js制作一个web RPG,在PHP中使用瓜js和SQL DB。这个问题是关于如何存储每个非玩家角色(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
};
我没有将所有地图对话框存储在同一个文件中,因为该文件会变得太混乱。。。因此:当映射发生变化时,我使用
js\u require
加载一个新的
js
文件,其中包含一组新的对话框:

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

任务编号:创建新NPC时(class
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风格,因为整个游戏遵循线性进程,但通过与世界上随机的人交谈,你可以灵活地开始任何你想要的任务

  • 游戏数据:游戏应为每个登录的玩家ID存储当前和完成的等级、每个等级的任务名称、每个任务的npc名称和每个npc名称的任务。它应加载以下树(红色=完成):

我的问题
  • 当游戏加载时,它应该记住我在上面的树中提到的那些事情。我已经将数据库设置为加载级别和任务信息(我只是从DB返回当前级别和任务数,然后通过上面显示的
    NPC对话框
    结构循环,将值存储在
    CurrentandCompleteLevel
    currentAndCompleteQuests
    数组中,直到循环达到DB的当前级别和任务数)…以及玩家的坐标和经验
然而,由于我允许玩家在任何时候开始、暂停、然后恢复任何NPC任务列表,因此我不能真正地将
NPC completed num
tasks completed num
列添加到数据库中。这是因为我不能像对
level
那样循环使用
NPC对话框的结构和加载ode>quest
信息,因为您完成NPC任务的顺序不是线性的。不知何故,我必须跟踪每个NPC完成的任务数量。我该怎么做

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

或者可以在userstats表中创建两个DB列,
currenpc
currTask
,然后循环通过一个关联数组,存储每个NPC的所有任务?但是,我需要为每个完成的NPC和每个NPC的完成任务创建一个列。哎,我的脑袋在转

当前数据库模式:


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

我还要补充:

  • npcnum
    这是该任务的NPC id,并且
  • tasknum
    是完成的任务数
因此,“子任务”实际上由
levelnum
questnum
npcnum
标识,我们可以将其与具有
id\u user
的用户关联

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

下面是建议的关系表的SQLFIDLE

假设您只需要在内存中存储当前子任务,我们可以使用一个数字数组来存储进度,假设
levelnum
questnum
始终是“当前”子任务


拥有usertasks的注意事项是,您将拥有旧任务和级别的条目,您最终会担心拥有一个包含子任务*用户行数的
NPCData
类型表。如果这感觉很混乱,那么另一个选项可能只是将javscript变量
tasks
转换为JSON并存储,loa当你加载
userstats
的时候,再把它放回去,这可能是更简单的方法。

你能在你的问题中澄清一下问题中的“NPC”是什么吗?我必须在网上搜索它!呸,这个问题非常详细(通常我们这里有相反的问题)。但是,我想知道您是否可以将问题变得更一般一些,以便更清楚,更不局限于您的用例?我们更喜欢对未来观众有用的问题。@halfer当然,我这个周末回家了,所以直到现在才看到这一点。我将尝试概括一下,不是我反对SQL,而是像may这样的无SQL数据库这里更合适。这看起来不错,但我希望避免每个玩家每个NPC都有多个db条目。这可以很快地加起来,不是吗?所以对于每个任务,有多个NPC,每个NPC可以有多个任务,对于n个玩家。我想这是没有办法的?我想,使用SQL,这应该不会是一个问题,因为它是为玩家准备的T
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);