我在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
文件:
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。它应该加载以下树(红色=完整):
NPC dialog
结构,将值存储在currentAndCompleteLevels
中和currentAndCompleteQuests
数组,直到循环达到当前级别并从DB获得任务数量)...以及玩家的坐标和经验...... 但是,由于我允许播放器随时启动,暂停,然后恢复任何NPC任务列表,我无法真正添加npc completed num
和tasks completed num
列到数据库。这是因为我无法循环NPC dialog
结构并加载方式与level
和quest
信息相同,因为您完成NPC任务的顺序是不是线性的。不知何故,我必须跟踪每个NPC完成的任务数量。我怎样才能做到这一点?
我正在考虑创建一个新的NPCData
表来存储游戏中的所有NPC,然后为该NPC存储current task num
......但是我必须为任何新的NPC创建一个新条目登录我的游戏的玩家。
或者可以在 userstats 表,currNPC
和currTask
中创建两个数据库列,然后循环存储每个NPC的所有任务的关联数组?但是,我需要为每个完成的NPC和每个NPC完成的任务提供一个列。哦,我的头在旋转。
当前数据库架构:
答案 0 :(得分:1)
我认为这是用户和任务之间经典的多对多数据库关系,在这种情况下,我建议创建一个关系表usertasks
。在这里,我将存储外键:id_user
,levelnum
,questnum
。
我还要补充一下:
npcnum
这是该任务的NPC ID和tasknum
这是完成的任务数量。所以“{subquest”实际上会由levelnum
,questnum
和npcnum
标识,我们可以将其与id_user
的用户联系起来。
因此,您可以加载为来自userstats加入levelnum
和questnum
的任务完成的任务,以便为当前时间点为用户完成每项任务的任务。
这是建议的关系表的SQLfiddle。
http://sqlfiddle.com/#!2/edea9/1
假设您只需要在内存中包含当前子请求,我们可以使用一组数字存储进度,假设levelnum
和questnum
将始终是“当前”。< / 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
时再次加载它可能是更简单的路径。