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

Gro*_*ler 7 javascript php mysql game-engine melonjs

我正在js中使用melon JS和SQL DB和PHP制作一个Web RPG.这个问题是关于如何存储每个非玩家角色(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
};
Run Code Online (Sandbox Code Playgroud)

没有将所有地图对话框存储在同一个文件中,因为文件会变得太杂乱......所以:当地图发生变化时,我会用一组新的对话框js_require加载一个新js文件:

在此输入图像描述

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

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

    game.player = me.game.getEntityByName(game.data.currNPC)[0];
    game.player.taskNum++;
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此输入图像描述

我的问题

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

但是,由于我允许播放器随时启动,暂停,然后恢复任何NPC任务列表,我无法在数据库中添加一个npc completed numtasks completed num列.这是因为我不能NPC dialog以与我所做的相同的方式循环结构和加载levelquest信息,因为你完成NPC任务的顺序不是线性的.不知何故,我必须跟踪每个NPC完成的任务数量.我怎样才能做到这一点?

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

或者,也许在创建两个数据库列userstats表,currNPCcurrTask通过关联数组存储每个NPC所有任务,然后循环?但是,我需要为每个完成的NPC和每个NPC完成的任务创建一个列.哦,我的头在旋转.

当前的DB架构:

在此输入图像描述

mfi*_*aus 1

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

我还要补充一下:

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

因此,“子任务”实际上由 标识levelnumquestnum并且npcnum我们可以将其与具有 的用户相关联id_user

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

这是建议的关系表的 SQLfiddle。

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

假设您只需要在内存中保存当前的子任务,我们可以用一组数字来存储进度,并假设levelnumquestnum始终是“当前”的。

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);   
Run Code Online (Sandbox Code Playgroud)

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