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

时间:2014-05-10 23:34:46

标签: 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
};

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

enter image description here

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

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

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

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

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

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

enter image description here

我的问题

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

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

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

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

当前数据库架构:

enter image description here

1 个答案:

答案 0 :(得分:1)

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

我还要补充一下:

  • npcnum这是该任务的NPC ID和
  • tasknum这是完成的任务数量。

所以“{subquest”实际上会由levelnumquestnumnpcnum标识,我们可以将其与id_user的用户联系起来。

因此,您可以加载为来自userstats加入levelnumquestnum的任务完成的任务,以便为当前时间点为用户完成每项任务的任务。

这是建议的关系表的SQLfiddle。

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

假设您只需要在内存中包含当前子请求,我们可以使用一组数字存储进度,假设levelnumquestnum将始终是“当前”。< / p>

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);   

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