gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:38:33 27 4
gpt4 key购买 nike

我正在用 js 制作一个网络 Angular 色扮演游戏,使用 melon JS 和 SQL DB 以及 PHP。这个问题是关于如何存储每个非玩家 Angular 色 (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
};

不会将所有 map 对话框存储在同一个文件中,因为文件会变得太杂乱...所以改为:本地图更改时,我使用 js_require加载新的 js带有一组新对话框的文件:

enter image description here

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

对于这个 Angular 色扮演游戏,我想实现以下目标:

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

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

enter image description here

我的问题

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

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

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

或者在userstats 表中创建两个数据库列,currNPCcurrTask ,然后遍历存储每个 NPC 的所有任务的关联数组?但是我需要为每个已完成的 NPC 和每个 NPC 已完成的任务创建一个列。哎呀,我的头在旋转。

当前数据库架构:

enter image description here

最佳答案

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

我还要补充:

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

因此,“子任务”实际上由 levelnumquestnumnpcnum 标识,我们可以将其与用户相关联 id_user.

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

这是提议的关系表的 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);

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

关于javascript - RPG - 为半复杂树结构存储玩家数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587430/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com