7

我正在用 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
};

没有将所有地图对话框存储在同一个文件中,因为文件会变得太杂乱......所以相反:当地图更改时,我使用一组新对话框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 级等),但对于每个 Quest,会生成一组 NPC...(您可以将它们视为子任务),每个包含 1 到 n 个任务。我想建立任务队列的灵活性,允许玩家以任何顺序与任何生成的 NPC 交谈……并以线性顺序完成任务(任务 1,然后 2,然后 3……)。这就像 GTA 风格,因为整个游戏遵循线性进程,但让您可以通过与世界上随机的人交谈来灵活地开始任何您想要的任务。

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

在此处输入图像描述

我的问题

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

但是,由于我允许玩家随时开始、暂停和恢复任何 NPC 任务列表,因此我无法真正在数据库中添加npc completed numtasks completed num列。这是因为我无法以与获取信息NPC dialog相同的方式遍历结构和加载,因为您完成 NPC 任务的顺序不是线性的。不知何故,我必须跟踪每个 NPC 完成的任务数量。我怎样才能做到这一点?levelquest

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

或者也许在userstats表中创建两个 DB 列,currNPC然后currTask循环遍历存储每个 NPC 的所有任务的关联数组?但是我需要为每个已完成的 NPC 和每个 NPC 完成的任务创建一个列。哦,我的头在旋转。

当前数据库架构:

在此处输入图像描述

4

1 回答 1

1

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

我还要补充:

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

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

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

这是建议的关系表的 SQLfiddle。

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

假设您只需要在内存中保存当前的子任务,我们可以用一组数字存储进度,假设levelnum并且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);   

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

于 2014-05-11T16:03:03.147 回答