我正在用 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
上面显示的结构,将值存储在 acurrentAndCompleteLevels
和currentAndCompleteQuests
数组中,直到循环达到当前级别和任务num from DB)...以及玩家的坐标和经验...
但是,由于我允许玩家随时开始、暂停和恢复任何 NPC 任务列表,因此我无法真正在数据库中添加npc completed num
和tasks completed num
列。这是因为我无法以与获取信息NPC dialog
相同的方式遍历结构和加载,因为您完成 NPC 任务的顺序不是线性的。不知何故,我必须跟踪每个 NPC 完成的任务数量。我怎样才能做到这一点?level
quest
我正在考虑创建一个新NPCData
表来存储游戏中的所有 NPC,然后current task num
为那个 NPC 存储......但是我必须为任何登录到我的游戏的新玩家创建一个新条目。
或者也许在userstats表中创建两个 DB 列,currNPC
然后currTask
循环遍历存储每个 NPC 的所有任务的关联数组?但是我需要为每个已完成的 NPC 和每个 NPC 完成的任务创建一个列。哦,我的头在旋转。
当前数据库架构: