// -*- Mode: Javascript -*- /*************************************** * シナリオデータの管理を担当する。[model.txt] * * 概要 * * 作成 2006-06-07 by yoshida ***************************************/ //////////////////////////////////////////////////////////// // 定数 //////////////////////////////////////////////////////////// HGRAPH=0;LGRAPH=1;RGRAPH=2;SGRAPH=3;PSELECT=4;FSELECT=5;MUSIC=6;TIMER=7;NEXTPAGE=8;PRISON=9;OUT=10;BLACK=11;WHITE=12;DGRAPH=13;WAVE=14;GRAPH=15;FLAG=16;RANDAM=17;NLGRAPH=18;STOP=19;TTOBBLIND=20;LTORBLIND=21;GOTOENDING=22;NIGHT=23;R=24;G=25;B=26;LASTERSTART=27;SELECTMUSIC=28;KAKUSHUKU=29;SCROLL=30;UP=31;DOWN=32;LEFT=33;RIGHT=34;SDEL=35;T=36;QUAKE=37;WAIT=38;NEWLINE=39;NOACT=40;T_NW=41;LFCLEAR=42;AFCLEAR=43;ENDING=44;white=45;PERIOD=46;RED=47; var CMDWAIT0 = [WAIT, 0]; // 行ウェイト var CMDWAIT1 = [WAIT, 1]; // 頁ウェイト var CMDNEWLINE = [NEWLINE]; var NEXTPAGEMAP = new Array(); NEXTPAGEMAP[NEXTPAGE] = [NEXTPAGE, NEXTPAGE]; NEXTPAGEMAP[OUT] = [NEXTPAGE, OUT]; NEXTPAGEMAP[PRISON] = [NEXTPAGE, PRISON]; NEXTPAGEMAP[TTOBBLIND]= [NEXTPAGE, TTOBBLIND]; //////////////////////////////////////////////////////////// // ユーティリティ //////////////////////////////////////////////////////////// /** * リストの先頭を返す関数 * @param list 処理するlist * @return list[0] */ function car(list) { if(undefined == list){ return undefined; } return list[0]; } /** * リストの先頭より後ろを返す関数 * @param list 処理するリスト * @return listの先頭より後ろのリスト */ function cdr(list) { if(undefined == list){ return undefined; } return list.slice(1,list.length); } /** * 要素とリストをつなげて新しいリストを作成する * @param head 先頭要素 * @param list リスト * @return headとlistをつなげたリスト */ function cons(head, list) { if(undefined == list){ return undefined; } return [head].concat(list); } function isContain(arr, elem) { if(undefined == elem){ return false; } if(undefined == arr){ return false; } return (undefined != arr[elem]); } //////////////////////////////////////////////////////////// // コンストラクタ //////////////////////////////////////////////////////////// /** * モデルオブジェクトのコンストラクタ * @return なし */ function WnovModel() { this.init = function(data, page){return WnovModelInit(this, data, page);}; this.getCmd = function(){return WnovModelGetCmd(this);}; this.next = function(){return WnovModelNext(this);} this.cmdList = new Array(); // コマンド一覧 this.step = 0; // コマンドポインタ } //////////////////////////////////////////////////////////// // メンバメソッド //////////////////////////////////////////////////////////// /** * WnovModelの初期化 * @param it WnovModelのインスタンス * @param data 初期化用データ * @param page 初期ページ * @return なし */ function WnovModelInit(it, data, page) { it.cmdList.length = 0; for(var i=0; i < data.length; i++){ var cmd = data[i]; var next = data[i+1]; it.cmdList = it.cmdList.concat(WnovModelMacroExpand(it, cmd, next)); } it.cmdList = it.cmdList.concat([[NOACT]]); it.step = 0; WnovModelSetPage(it, page); // 頁、ステップの初期化 } /** * 現在のコマンドを返す。 * @param it WnovModelのインスタンス * @return コマンド配列 */ function WnovModelGetCmd(it) { return it.cmdList[it.step]; } /** * 現在のコマンドを返す。 * @param it WnovModelのインスタンス * @return コマンド配列 */ function WnovModelNext(it) { if(it.step+1 < it.cmdList.length){ it.step++; } } /** * 指定のページまでコマンドポインタを進める * @param it WnovModelのインスタンス * @param PageNo 指定ページ番号 * @return コマンド配列 */ function WnovModelSetPage(it, PageNo) { var CurPage = 0; for(var i=0; i < it.cmdList.length; i++){ if(CurPage == PageNo){ it.step = i; return it.step; } if(NEXTPAGE == it.cmdList[i][0]){ CurPage++; } } } /** * マクロを展開する * @param it WnovModelのインスタンス * @param cmd コマンド * @param next 次のコマンド * @return 展開後の配列 */ function WnovModelMacroExpand(it, cmd, next) { if(undefined == cmd){ return [NOACT]; } var func = WnovModelFUNCMAP[cmd[0]]; if(undefined == func){ return [cmd]; } return func(it, cmd, next); } //////////////////////////////////////////////////////////// // マクロ展開関数 //////////////////////////////////////////////////////////// /** * マクロ展開関数の型 * @param it WnovModelのインスタンス * @param cmd コマンド * @param next 次のコマンド * @return 展開後の配列 */ /// マクロ展開関数の連想配列 var WnovModelFUNCMAP = new Array(); /// [T]の展開。1文表示とWAITに展開。 WnovModelFUNCMAP[ T ] = function(it, cmd, next){ var result = new Array; var tag = car(cmd); var texts = cdr(cmd); for (var i in texts) {var x = texts[i]; result.push([tag, x]); result.push(CMDWAIT0); } result.pop(); if(isContain(NEXTPAGEMAP, car(next))){ result.push(CMDWAIT1); } else { result.push(CMDWAIT0); result.push(CMDNEWLINE); } return result; } /// [T_NW]の展開 WnovModelFUNCMAP[ T_NW ] = function(it, cmd, next){ var result = new Array; var tag = T; var texts = cdr(cmd); for (var i in texts) {var x = texts[i]; result.push([tag, x]); } result.push(CMDNEWLINE); return result; } /// [OUT]の展開 WnovModelFUNCMAP[ OUT ] = function(it, cmd, next){ return [NEXTPAGEMAP[OUT].concat(cmd[1])]; } /// [NEXTPAGE]の展開 WnovModelFUNCMAP[ NEXTPAGE ] = function(it, cmd, next){ return [NEXTPAGEMAP[NEXTPAGE].concat(cmd[1])]; } /// [PRISON]の展開 WnovModelFUNCMAP[ PRISON ] = function(it, cmd, next){ return [NEXTPAGEMAP[PRISON].concat(cmd[1])]; } /// [TTOBBLIND]の展開 WnovModelFUNCMAP[ TTOBBLIND ] = function(it, cmd, next){ return [NEXTPAGEMAP[TTOBBLIND].concat(cmd[1])]; } /// [MUSIC]の展開 WnovModelFUNCMAP[ MUSIC ] = function(it, cmd, next){ return [[cmd[0], cmd[1]+".mp3"]]; } /// [WAVE]の展開 WnovModelFUNCMAP[ WAVE ] = function(it, cmd, next){ return [cmd]; }