メッセージ

2013年04月29日の記事

2013/04/29(月)ECO Sim: Codeの仕様(仮)

ECO Sim: Codeの仕様(仮)

基本情報

Codeは元はバイナリ列のデータでBase64ライク*1な変換規則で文字列に変換したものである。バイナリ列操作や、文字列への変換操作は、util.js内のbitFieldオブジェクトを通じて行う。

以下はデバッグ用のtoBinメソッドの使用例。

javascript:(new bitField("1zP1xgX00")).toBin()
"000000000000111011010000100001000001110011100011000001"
                                                 ~~~~~~
                                                 ここが先頭の1に対応する値

javascript:(new bitField("1zP11hX0Qe00")).toBin()
"000000000000001110110100000000111011010001000001000001110011100011000001"

javascript:(new bitField("1zP1xhX0Qe0J300")).toBin()
"000000000000000011101101000000001110110100000000111011010001100001000001110011100011000001"

イリスカードのCodeについて

javascript:(new bitField("1zP1xgX00")).toBin()
                                      "0 0000 0000000111011010 0001 0000 1 000001110011 100011000001"
                                      [8][7]  [6]              [5]  [4] [3][2]          [1]

javascript:(new bitField("1zP11hX0Qe00")).toBin()
                   "000 0000 0000000111011010 0000000111011010 0010 0000 1 000001110011 100011000001"
                    [8] [7]  [6]              [6]              [5]  [4] [3][2]          [1]

javascript:(new bitField("1zP1xhX0Qe0J300")).toBin()
"00000 0000 0000000111011010 0000000111011010 0000000111011010 0011 0000 1 000001110011 100011000001"
 [8]   [7]  [6]              [6]              [6]              [5]  [4] [3][2]          [1]

イリスカードのCodeを構成するビット列を意味のある単位で分割すると上記の通りになる。各セクションの意味は以下の通り。

  • [1] イリスカードcodeマジックナンバー
  • [2] 現バージョン
  • [3] 有効フラグ
  • [4] 武器イリスカード数
  • (カードがあるならここに必要数カードindex)
  • [5] 服イリスカード数
  • [6] カードindex(必要数繰り返す)
  • [7] 胸アクセイリスカード数
  • (カードがあるならここに必要数カードindex)
  • [8] あまり(0埋め)

ECO Sim中でビット列を組み立てているコードは以下の通り。(codeは、最後に bf.toString() で得られる。)

[storage.js]
var bf = new bitField();
bf.push(target.code.masic_no,12); //イリスカードcodeマジックナンバー
bf.push(current_ver,12); //現バージョン

[iris.js]
if(!enable){
  bf.push(0,1); //無効フラグ
  return;
}else{
  bf.push(1,1); //有効フラグ
}

for(i=0;i<iris.parts_num;i++){
  bf.push(slot[i].length,4); //この部位の装備カード数(bit 3->4 on version 111)
  for(j=0;j<slot[i].length;j++){
    var idx = slot[i][j];
    bf.push(idx,16); //カードindex保存
  }
}

*1 : 変換テーブルがBase64と異なるのは、Base64のこと忘れてて適当に変換テーブルを作ったため