考虑到以下树形结构,每个登录的玩家可以拥有当前和已完成级别的数据,每个级别的任务,每个任务的NPC以及每个NPC的多个任务......我正试图找出最佳方法存储每个玩家的当前和已完成数据。
之前我问过这个问题,虽然细节太多了。有人要求我概括这个问题......所以如果你想要更多的背景,请看这里:
RPG - storing player data for semi-complex tree structure
有关我的RPG结构的一些信息:
NPC对话框和任务对话框数据存储在以下结构的npc_dialog_1.js
文件中的js对象中:
var dialog = {
quests : {
questName : {
NPCName: {
TaskName: {
"english" :
[
"Hello, here is some dialog",
],//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
};
我将每个dialog
对象存储在每个地图的单独npc_dialog_n.js
文件中,我正在使用requireJS
检索。这将减少单个npc_dialog文件中的混乱。
然而,每个任务的NPC可以以任何顺序启动......这是试图模仿GTA风格的任务队列,因为游戏遵循一般的线性进展,但是对于每个任务,你可以与之交谈多个NPC,随时启动,暂停和恢复NPC的任务。
由于玩家可以在给定时间按任何NPC启动,暂停和恢复任务,我正在尝试找出每个玩家存储当前和已完成数据的最佳方式。
mfirdaus 推荐以下数据库表格与M:M关系b / t用户& npc ......然而这会很快加起来,因为每个玩家每次任务可以拥有多个NPC,并且每个NPC都会启动多个任务......有什么方法围绕这个设置?
我当前的数据库架构:
谢谢
答案 0 :(得分:2)
假设你有这个数组:
$player_quest_status = array("quest1" => 100,
"quest2" => 90,
"quest3" => 50);
将这些数组存储到数据库中可以有2个选项。
使用PHP json_encode():
$player_quest_status_json = json_encode($player_quest_status);
//then you can store $player_quest_status_json variable using INSERT.UPDATE
语句 //编码时的数组:{“quest1”:100,“quest2”:100,“quest3”:100}
在从数据库中检索值后,使用json_decode将其转换回数组。
使用PHP 序列化():
$player_quest_status_json = serialize($player_quest_status);
//array when encoded: a:3{s:6:"quest1";i:100;s:6:"quest2";i:100;s:6:"quest3";i:100;}
了解您想要使用的功能的更多信息:
Preferred method to store PHP arrays (json_encode vs serialize)
虽然我仍然推荐json,因为它更具可扩展性。
$player_quest_status = array("player_id" => 1,
"level" => 1,
"quests" => array( 1/*quest_id*/ => array("percent_completed" => 100,
"quest_title" => "the first quest"),
2/*quest_id*/ => array("percent_completed" => 80,
"quest_title" => "the second quest"),
3/*quest_id*/ => array("percent_completed" => 50,
"quest_title" => "the 3rd quest")
)
);
$player_npc_status = array("npc" => array( 1 => array("name" => "lawrence",
"tasks" => array( 1 => array("task_title" => "title 1",
"is_completed" => 1),
2 => array("task_title" => "title 2",
"is_completed" => 1),
3 => array("task_title" => "title 3",
"is_completed" => 0))
),
2 => array("name" => "viscocent",
"tasks" => array( 1 => array("task_title" => "title 4",
"is_completed" => 1),
2 => array("task_title" => "title 5",
"is_completed" => 2),
3 => array("task_title" => "title 6",
"is_completed" => 0))
),
)
);
答案 1 :(得分:1)
我认为独立于存储的Quest / Task树,存储游戏进度就足以存储currentLevel,currentQuest以及为你所提到的每个NPC完成的任务数量。根据你的存储方式,我会有一个存储当前任务的数组或对象。例如,对于用户1,它看起来像
var currLevel = 2;
var currQuest = 2;
var currNpc =2
var subquests = [3,1,3]; //or {"NPC1":3,"NP2":1,"NPC3":3}
//progress task
subquests[currNpc]= subquests[currNpc] ? subquests[currNpc]+1 : 1
//next quest
currQuest++
subquests=[]
因此,根据您的工作流程,您可以通过执行
从数组或对象生成JSON字符串var str=JSON.stringify(subquests); //javascript
$str=json_encode($array); //PHP
您可以将其存储在数据库中。然后,您可以使用
以javascript或php(取决于您的工作流程)恢复该值var subquests=JSON.parse(json_string); //javascript
$subquests=json_decode($json_string); //PHP
我认为数据库看起来像这个sqlfiddle http://sqlfiddle.com/#!2/8d436/1/0