7

melon JS と PHP で SQL DB を使用して、js で 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)、NPC のインスタンスごとtaskNumに 0 に設定されたローカル変数を作成します。彼らがタスクを完了すると、その NPC のタスク番号にアクセスしてインクリメントするだけです。

    game.player = me.game.getEntityByName(game.data.currNPC)[0];
    game.player.taskNum++;

この RPG では、次のことを達成したいと考えています。

  • GTA スタイルの無料ワールド クエスト キュー:レベルの進行、クエストの進行、NPC ごとのタスクの進行は直線的 (レベル 1 を完了するとレベル 2 に進むなど) ですが、クエストごとに一連の NPC が生成されます... (それらはサブクエストと考えることができます)、それぞれに 1 から n のタスクが含まれます。プレーヤーが任意の順序で生成された NPC と会話できるようにするクエスト キューの柔軟性を組み込みたいと考えています...そしてタスクを線形の順序で完了することができます (タスク 1、2、3...)。ゲーム全体が直線的な進行に従うため、これは GTA スタイルに似ていますが、世界中のランダムな人々と話すことで、必要なクエストを柔軟に開始できます。

  • ゲーム データ:ゲームは、現在および完了したレベル、レベルごとのクエスト名、クエストごとの npc 名、および各ログイン プレイヤー ID の npc 名ごとのタスクを保存する必要があります。次のツリーをロードする必要があります (赤 = 完全)。

ここに画像の説明を入力

私の質問

  • ゲームが読み込まれると、上記のツリーで述べたことが記憶されているはずです。レベルとクエスト情報をロードするように DB をセットアップしました (DB から現在のレベルとクエスト番号を返すだけで、ループが現在のレベルとクエストに到達するまで、配列にNPC dialog値を格納する上記の構造をループします。 num from DB)...プレイヤーの座標と経験値も...currentAndCompleteLevelscurrentAndCompleteQuests

ただし、プレーヤーがいつでも NPC タスク リストを開始、一時停止、再開できるようにしているため、データベースにnpc completed numand列を実際に追加することはできません。tasks completed numこれは、NPC クエストを完了する順序が線形ではないNPC dialogため、構造をループして情報をロードするのと同じ方法でlevelループできないためです。どういうわけか、NPC ごとに完了したタスク数を追跡する必要があります。これどうやってするの?quest

NPCDataゲーム内のすべての NPC を格納する新しいテーブルを作成し、current task numその NPC を格納することを考えていましたが、ゲームにログインした新しいプレイヤーのために新しいエントリを作成する必要があります。

または、 userstatsテーブルに2 つの DB 列を作成しcurrNPCcurrTaskNPC ごとにすべてのタスクを格納する連想配列をループしますか? ただし、完了した NPC ごとに 1 つの列と、NPC ごとの完了したタスクが必要になります。おい、頭がぐるぐるしてる。

現在の DB スキーマ:

ここに画像の説明を入力

4

1 に答える 1

1

これは、ユーザーとタスクの間の古典的な多対多のデー​​タベース関係であると思います。その場合、関係テーブルを作成することをお勧めしますusertasks。ここでは、外部キーを格納します: id_user, levelnum, questnum.

私も追加します:

  • npcnumこれはそのクエストの NPC ID であり、
  • tasknumこれは完了したタスクの数です。

したがって、「サブクエスト」は実際には で識別されlevelnumquestnumそれnpcnumを でユーザーに関連付けることができますid_user

levelnumそのため、userstats に参加しているクエストに対して実行されたタスクをロードquestnumして、ユーザーの現在の時点の各タスクに対して実行されたタスクを取得できます。

提案されたリレーションシップ テーブルの SQLfiddle を次に示します。

http://sqlfiddle.com/#!2/edea9/1

現在のサブクエストのみをメモリに保持する必要があると仮定するlevelnumと、questnum常に「現在の」サブクエストであるという前提で、進行状況を数値の配列で保存できます。

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 を使用する場合の注意点は、古いクエストとレベルのエントリがあり、subquests NPCData*users 数の行を持つ型テーブルを作成する心配が生じることです。これが面倒だと感じる場合は、javascript 変数tasksを JSON に変換して保存し、ロード時に再度ロードするという別のオプションよりも、userstatsおそらく簡単な方法です。

于 2014-05-11T16:03:03.147 に答える