RPG - 存储玩家数据

时间:2014-05-11 23:54:59

标签: javascript php mysql storage

考虑到以下树形结构,每个登录的玩家可以拥有当前和已完成级别的数据,每个级别的任务,每个任务的NPC以及每个NPC的多个任务......我正试图找出最佳方法存储每个玩家的当前和已完成数据。

enter image description here

之前我问过这个问题,虽然细节太多了。有人要求我概括这个问题......所以如果你想要更多的背景,请看这里:

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都会启动多个任务......有什么方法围绕这个设置?

enter image description here

我当前的数据库架构enter image description here

谢谢

2 个答案:

答案 0 :(得分:2)

选择正确的使用方法

假设你有这个数组:

$player_quest_status = array("quest1" => 100,
                             "quest2" => 90,
                             "quest3" => 50); 

将这些数组存储到数据库中可以有2个选项。

  1. 使用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将其转换回数组。

  2. 使用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;}
    
  3. 了解您想要使用的功能的更多信息:
    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