2010/12/10(金)モンスターデータベース構想

モンスターデータベースを作ろうと、いろいろ構想を練っているのでその内容をメモ。



要件とか

  • モンスター情報の登録、閲覧
  • 各種条件での検索、絞り込み
    • 種族
    • 生息地域
      • エミル世界などの大雑把な指定や、ノーザンダンジョン1Fなどの細かな指定の両方を可能に
    • LV
    • 経験値
    • 属性
  • 代表的な条件はリンクで提供(クリックしたら動物系一覧表示など)
  • 各検索条件に対して一意のURLを割り当てる
  • 検索などはクライアントサイド(JavaScript)で実行
    • 閲覧時のデータのやりとりは、ロード時に全モンスターデータを渡すのみ*1
  • サーバーサイドはperl(DBI)+SQLite?*2
  • ECO-wikiのモンスターデータ記載形式での出力
  • 画像は扱わない

*1 : あまりに愚直なので、少しは工夫するかも?

*2 : SQLiteが出てきたのは、さくらインターネットのライトプランがこれしかDBをサポートしていないから。データ管理できれば別に何でもいい。

モンスターデータ

必要項目

識別子項目名データ型備考
class種族enum:class死霊選択肢を準備
family系列enum:familyデス系選択肢を準備、内容が種族に依存
wiki_image画像stringhttp://img1.gamedb.info/eco/monster/Guards.jpgECO-wiki形式出力用
name名前stringガーズ 
lvLVinteger43 
hpHPinteger3200 
expExpinteger3600 
jobexpJobinteger1800 
element属性array:integer0,0,0,0,0,1属性値不明の場合は考え得る最小値を入力
attribute性格(行動タイプ)stringActive(選択肢を準備?)、複数の値を持つ
habitat出現場所array:enum?:areaエミル世界/ダンジョン/ノーザンダンジョン/1F
エミル世界/インスタンスダンジョン/集う魔物/第4階層
エミル世界/インスタンスダンジョン/遺跡の宝探し/-
選択肢を準備、4段程度の階層データ、複数の値を持つ
itemドロップ品string-multiline
破れた魔法書
!鉄製の大きな刀身
@ブランクイリスカードUC
複数の値を持つ、行頭の記号で知識の必要性などを指定
&知識があると出やすいもの
@知識が無ければ出ないもの
!極めて稀なもの
?未確定
%パーティドロップ
skill使用スキルstring-multilineブラックウィドウ
サイレントポゼション
スタンポゼション
複数の値を持つ
noteその他string-multilineガーズ召喚でのみ出現(ノーザンD)
高HP
高M.ATK
高ASPD
警告無しに襲ってくること有り
 
bossボス属性boolFALSE 
undeadアンデッドinteger100ヒーリングダメージ倍率を記入(0が非アンデッド)
last_modified最終更新日時date201010312350更新時の衝突検出などに必要

※[12/10 21:00]最終更新日時を追加

データ構造

mobdb.data[i] = {
    class     : "死霊"   //内部データ形式は数値(連番)?
  , family    : "デス系" //内部データ形式は数値(連番)?
  , wiki_image: "http://img1.gamedb.info/eco/monster/Guards.jpg"
  , name      : "ガーズ"
  , lv        : 43
  , hp        : 3200
  , exp       : 3600
  , jobexp    : 1800
  , element   : [0,0,0,0,0,1]
  , attribute : "Active" //配列にするかも?
  , habitat   : [
                    [エミル世界","ダンジョン","ノーザンダンジョン","1F"] //内部データ形式は数値(連番)?
                  , [エミル世界","インスタンスダンジョン","集う魔物","第4階層"]
                  , [エミル世界","インスタンスダンジョン","遺跡の宝探し","-"]
                ]
                
                //行区切りは<br> or \n?、もしくは配列で管理?
                //(表示・検索の効率はどれが一番良いか)
  , item      : "骨<br>破れた魔法書<br>鉄製の大きな刀身<br>ブランクイリスカードUC<br>"
  , skill     : "ブラックウィドウ<br>サイレントポゼション<br>スタンポゼション"
  , note      : "ガーズ召喚でのみ出現(ノーザンD)<br>高HP<br>高M.ATK<br>高ASPD<br>警告無しに襲ってくること有り"
  , boss      : false
  , undead    : 100
};

JavaScript上では、上記の構造で良いとしても、これ(特に生息地域)をデータベースでどう管理するべきか。検索してみたところ、関係データベースで階層構造のデータを扱うという話題・方法はいろいろあるようですが…。

今回はSQLで検索とかほとんど考えてないので、割り切って適当な文字列形式で格納してしまうのがお手軽でしょうか。*3


*3 : これに関しては、そもそも関係データベースを使うのが不適当かもしれません。でも今回はデータの登録と取得がそれなりのパフォーマンスで実現できればいいだけなので、まあいいかなあ^^;

種族・系列

一覧

2段の階層構造

  • 動物系
    • アーチン系
    • ウィリー・ドゥ系
    • ゲッコ系
    • ゼレブ系
    • ドラゴ系
    • ドラゴン系
    • バウ系
    • バクバク系
    • バルル系
    • ベア系
    • ボア系
    • モーモー系
    • ローキー系
  • 鳥系
    • キメラ系
    • コッコー系
    • サンダーバード系
  • (省略)
  • 岩系
    • カンカン系
    • クリスタルアーチン系
    • ゴーチン系
    • タートル系
    • ラバープルル系
  • 未分類
    • -

データ構造

依存関係を持つセレクトボックスを生成するのが目的なので、それに適したデータ構造が必要。

mobdb.classlist = [
    {name:"動物系", familylist:
      ["アーチン系","ウィリー"・"ドゥ系","ゲッコ系","ゼレブ系","ドラゴ系"
      ,"ドラゴン系","バウ系","バクバク系","バルル系","ベア系","ボア系"
      ,"モーモー系","ローキー系"]
    }
  , {name:"鳥系", familylist:[/*---*/]}
  //省略
  , {name:"岩系", family:[/*---*/]}
  , {name:"-", family:["-"]}
];

//参照
mobdb.classlist[0].name; //=="動物系"
mobdb.classlist[0].family[0]; //=="アーチン系"

こっちの方が良いかも?

mobdb.classlist = ["動物系","鳥系",/*---*/,"岩系","-"];

mobdb.familylist[0] = ["アーチン系","ウィリー"・"ドゥ系","ゲッコ系","ゼレブ系","ドラゴ系"
      ,"ドラゴン系","バウ系","バクバク系","バルル系","ベア系","ボア系"
      ,"モーモー系","ローキー系"];
mobdb.familylist[0].name = "動物系",;

mobdb.familylist[1] = [/*---*/];
mobdb.familylist[1].name = "鳥系",;
  //省略
mobdb.familylist[7] = [/*---*/];
mobdb.familylist[7].name = "岩系",;

mobdb.familylist[8] = ["-"];
mobdb.familylist[8].name = "-",;


//参照
mobdb.classlist[0].name; //=="動物系"
mobdb.classlist[0][0]; //=="アーチン系"

出現場所

一覧

4段の階層構造

  • エミル世界
    • フィールド
      • 東アクロニア平原
      • 西アクロニア平原
      • 南アクロニア平原
      • 北アクロニア平原
    • ダンジョン
      • 氷結の坑道
        • 1F
        • 2F
        • 3F
    • インスタンスダンジョン
      • 黒き王
      • 急襲アンデッドの城
      • 集う魔物
        • 第1階層
        • 第2階層
        • 第3階層
        • 第4階層
        • 第5階層
  • タイタニア世界
    • フィールド
    • ダンジョン
    • インスタンスダンジョン
      • 忘却の庭園Ⅰ
      • 忘却の庭園Ⅱ
      • 忘却の庭園Ⅲ
      • 忘却の庭園Ⅳ
  • ドミニオン世界
    • フィールド
    • ダンジョン
  • その他
    • ディメンションダンジョン
      • ディメンション廃炭鉱
        • B1F
        • B2F
        • B3F
    • 無限回廊
      • B1F~B20F
      • B21F~B40F
    • 都市攻防戦
    • イベント

※ECO-wikiの分類に準じる

データ構造

種族・系列のを4段にした感じ

mobdb.area = [
    {name:"エミル世界", child:
      [
          {name:"フィールド", child:
            [
                //省略
            ]
          }
        , {name:"ダンジョン", child:
            [
                {name:"フィールド", child:
                  [
                      //省略
                  ]
                }
              , {name:"ダンジョン", child:
                  [
                      {name:"氷結の坑道", child:
                        [
                            "1F"
                          , "2F"
                          , "3F"
                        ]
                      }
                    , {name:"イーストダンジョン", child:
                        [
                          //省略
                        ]
                      }
                  ]
                }
              , {name:"インスタンスダンジョン", child:
                  [
                      //省略
                  ]
                }
            ]
         }
        , {name:"インスタンスダンジョン", child:
            [
                //省略
            ]
          }
      ]
    }
  , {name:"タイタニア世界", child:[/*---*/]}
  //省略
];

//参照するとき
mobdb.area[0].name;
mobdb.area[0].child[0].name;
mobdb.area[0].child[0].child[0].name;
mobdb.area[0].child[0].child[0].child[0];

//種族・系列のところでやったようにchild無しで参照できるようにしたり、
//fullnameってプロパティつけるのもありかもしれない。