14.ストーリーについて

 進捗状況

今回はストーリーの解説とflagの内容についてメインに紹介したいと思います。
現時点での仕様なので変更する場合があります。

ストーリー概要

ストーリーはざっくり説明すると
・シイタケを東の村の人に届ければ億万長者になれると聞く。
             ↓
・宝箱にあるが道中暗くて、たどり着けない。
             ↓
・コイン5枚でライトを売ってくれると聞いたため、店に5枚持った状態で訪れる。
             ↓
・ライトを手にして宝箱の中のシイタケを手にする。
             ↓
・シイタケを届けて、億万長者?になる。

非常に単純でコンパクトなものとなっています。

プログラミングの構造

このゲームはCoinの枚数とflag1,2,3,4によって話が進んでいきます。
この表示はCoinの枚数とflagのON、OFFが分かるようにしてますが、flagについては会話の内容を見れば表示がなくてもストーリーの進み具合が分かるようにしてあります。

ストーリーの表示と条件分岐に関しては
function eventpaint(evnum)
この関数が担っています。

ストーリーに関する配列は90番台で、現在90~96の7つ分の会話が存在しており、
switch (evnum) {
                case 90://案内役
switch文によって作られています。
さらに、そこからif文でflagの状況ごとに会話の内容を変えています。
else if(flag2 == true && flag4 == false) {

flagは分かりやすいようにするため持ち物に対応しています。

はじめはすべてfalse
        var flag1 = false //フラグ管理
        var flag2 = false
        var flag3 = false
        var flag4 = false

flag1:コインが5枚以上でtrue
flag2:ライトの所持でtrue
flag3:宝箱のカギの所持でtrue
flag4:シイタケの所持でtrue

ストーリーの詳細

各caseごとの会話内容を詳細に紹介します。表示される画像が全部同一ですが、後々変える予定です。

・case90

map0(開始地点付近)にいて案内役を担う

flagによる変化なし

・case91

ライトをコイン5枚で売る店の人

                    if(flag2==true){//ライトすでに交換済み

                    else if(flag1==false){//5枚以下


                    else if(flag1==true){//5枚以上で交換


交換したらコインを5枚減らし、flag2をtrueへ
                    flag1=false;
                    coinCount -= 5;
                    flag2=true;
if文で先にflag2==trueの判定をしているのは、一度ライト所持したら以降のコイン枚数が関係しているelse ifを発動させないようにしているためです。

・case92

map3の洞窟入り口にいる案内役

flagによる変化なし(会話固定)

・case93

洞窟の中にいる案内役。map9はライトがなければマップが黒く塗りつぶされるため、この人と会話することで、ライトが必要なことが分かるようにしてある。

                    break;
                case 93://洞窟案内
                    if(flag2 == false) {
                        gc.fillText("洞窟の人「この下は とても暗い", 250, 200);
                        gc.fillText("ライトがあれば 問題なし", 285, 230);
                        gc.fillText("はじめの村で 交換してくれるよ", 285, 260);
                        gc.fillText("コイン5枚持っていれば 勝手に引き換えられてしまう", 285, 290);
                        gc.fillText("ひどい商売してるよね」", 285, 320);
                    }
                    else if(flag2 == true && flag4 == false) {
                        gc.fillText("洞窟の人「わざわざ ライト買ったんだ", 250, 200);
                        gc.fillText("それがあれば もしかして 迷路を抜けて", 285, 230);
                        gc.fillText("宝箱にたどり着くかも?", 285, 260);    
                        gc.fillText("あれ? 鍵がかかってたっけ?」", 285, 290);    
                    }
                    else if( flag2 == true && flag4 == true) {
                        gc.fillText("洞窟の人「宝箱を開けた?", 250, 200);
                        gc.fillText("え 中に入っていたのは シイタケ?」", 285, 290);  

                    }
                    else if( flag2 == false && flag4 == true) {
                        gc.fillText("洞窟の人「ライトなしで 迷路を進むなんて", 250, 200);
                        gc.fillText("あなた 変わり者だね」", 285, 230);
                    }
                    break;
ライトがなければ交換を案内、あればこの先に宝箱があることを示してくれている。
シイタケを入手後それに応じた会話だが、ライトなしで迷路を突破したときは、変人扱いされる。

・case94

宝箱を開けるためのカギ

入手でflag3がtrue
flagによるテキスト変化なし

・case95

宝箱、この中にシイタケが入っている。開けたら空箱になる。
flag3falseでは鍵がかかってて開かない

鍵所持、シイタケ未所持で
                    else if(flag3 == true && flag4 == false){
setTimeout関数により1秒後に
「シイタケを手に入れた」を表示させ、flag4をtrue
この1秒間に勝手に移動しないようにstopkeyのflagを作りました。trueになるとキー操作を受け付けなくしています。

・case96

シイタケ好きにシイタケを渡したら無限にとれる(取っても消えない)コインが2つ左のマスに現れる。
                    case 96://シイタケ好き
                    if (flag4 ==false){
                    gc.fillText("シイタケ好き「伝説のシイタケを 持ってくれば", 250, 200);
                    gc.fillText("億万長者に してあげる」", 285, 230);
                    break;
                    }
                    else if(flag4 ==true){
                    stopKey = true;
                    gc.fillText("シイタケ好き「これが伝説のシイタケ!", 250, 200);
                    gc.fillText("お礼に 無限コインと 交換だ!」", 285, 230);
                    stopKey = false;
                    map[stage][py][px - 2] = 82;

このカラフルなコインは取っても消えないコインです。

ストーリーの終わりについて

現在ストーリーの終わりの表示は作っていません。今後作成したいと思います。



その他進捗について

コインや鍵などのアイテム獲得したときの地面の表示を配列にしました。
var stageFloor = [1, 1, 2, 2, 3, 3, 2, 2 ,1 ,3, 2]
1が村の中、2が草原、3が洞窟