ionicを試す 20日目 ゲームブックアプリ:データの概要
まず最初に書いておきたいのが、ゲームブックと言うのモノはある程度シンプルであるべきという事です。
実際にコードを書いていて、この調子なら"Wizardry"位なら実装できるとは思いました。
しかし、所持アイテムの管理とか戦闘での特殊能力の使用とか取り入れていくことはゲームブックらしさがなくなる気がします。(面白そうなので、そのうちダンジョン物も作ってみたいですが)
ですので制約として
・プレイヤーのステータスは以下の3種類
・HP:ヒットポイント・体力値
・AP:アタックポイント・攻撃力
・GP:所持金
・所持アイテムの概念はない(必要ならばフラグで疑似的に実装)
・戦闘はサイコロの目と基準値を比較して先攻・後攻を決めた後は交互に攻撃
・戦闘の終了は自他いずれかのHPが0で終了。(シナリオ設定でゲームを続けることは可能)
を設けました。(ステータスの表記名はBook.jsonで変更可能)
また、各ページには以下のページタイプがあります。
・'Select':選択肢を選んで次のページを決める
・'Judgement':サイコロを振り、基準値との大小比較で次のページが決まる
・'Multiple':サイコロの出目により、それぞれ次のページが決まる
・'Attack':”敵”と戦い、その勝敗により次のページが決まる
・'Flagcheck':所持しているフラグの有無により次のページが決まる
・'Statuscheck':HP、AP、GPの値と基準値を比較して次のページが決まる
・'Ending':エンディング。1ページ目に戻るのみ可能。
これは7種類ですが、実際はステータスチェックにHP、AP、GPの3種類があり9種類です。
---------------------余談-----------------------------------------
前のデータを今回のデータにコンバート(変換)する時にどのステータスのチェックかを決めるデータを作り忘れたので、手短に'Type'の方を増やして対応しました。
こういう場合、正規表現で変換したり簡単な関数を作ってconsole.logで書き出しますが、今回は'Type'を増やす方が、楽過ぎましたのでそちらで行いました。
正規表現も毎回あんちょこ見るレベルですが、文字列のチェックならば強力な援軍です。
ソースコードの検索などにも使えます。
テスト一例:
let PatternN = /^[1-9][0-9]*$/; //テスト文字列は正の10進数のみ許容
if(!PatternN.test(テスト文字列)){alert('エラーです。')}
-------------------------------------------------------------------
セーブやコンティニュー用に保持すべきデータはPage.jsonのデータに比べて多くは無く、下記のデータと配列に保持されているフラグ情報で事足ります。
---------------------
//StoryData コンティニューや保存、ページ変更時にセット
StoryData = {
"ThisPage":"",
"myHP":"",
"myAP":"",
"myGP":"",
"myMaxHP":"",
"myMaxAP":"",
"myMaxGP":"",
"myInitHP":"",
"myInitAP":"",
"myInitGP":"",
"myMaxInitHP":"",
"AttackerName":"",
"AttackerHP":"",
"AttackerMaxHP":"",
"AttackerAP":""
};
---------------------
このデータは各ページの先頭の処理で再セットされます。
これとは別に、戦闘中などのデータも持ちますが、コンティニューやセーブデートのロード時には、あくまでそのページの最初のデータ使用します。
(結果が出ても、次のページの移行前なら再起動して再挑戦可能ですね。)
JSONデータの仕様上、各データは文字列として保持されます。
これはPage.jsonにも当てはまりますので、数値として処理したいデータを使う際は十分な注意が必要です。
一例:
99と100の比較
数値99 < 数値100
文字列100 < 文字列99 (先頭の文字のチェックですでに大小が決まるケース)
ですのでゲームブックの最初のページを読み込む前に、Page.jsonを全件を見て数値チェックや整合性チェック(行先のページが無いなど)を行う事をお勧めします。
チェックの一例
---------------------------------------------------------------
if(sFlagOn!=""&&sFlagOn!="1"&&sFlagOn!="2"){
this.FatalErrorText = "\n致命的なエラーが発生しました\n";
this.FatalErrorText += "Page : " + key + "\n";
this.FatalErrorText += "PageData[key]['FlagOn'] は''、'1'、'2'のみが許されます。\n";
this.FatalErrorText += "PageData[key]['FlagOn'] : " + PageData[key]['FlagOn'];
this.intCountError++;
this.strCountError += this.FatalErrorText;
}
---------------------------------------------------------------
上記の例では、エラーの数をintCountErrorで数え、10を超えるか全件チェックしてエラーがあれば、エラー内容strCountError(複数のエラー内容がありうる)をエラー表示用画面に出力します。
細かいことを言えば、まだまだあるのですが、チェックとデータの定義でかなりのコードになっています。転ばぬ先の杖ですね。
Import等 :12 (1%)
データ定義 :143(12.6%)
読込 :105(9.3%)
データチェック:340(30.0%)
プログラム処理:534(47.1%)
次回は、各タイプごとの処理を簡単にまとめていきたいと思います。




