・シナリオを組込む
前回までで,マップ上を移動出来るようになった。
今回は最初に作成したメッセージウィンドウに,シナリオを表示出来るようにしよう。
しかし,もうここまで来ると WonderWitchの話では無くて,C言語の話になっていますね(^^;
・移動判定
ある場所に移動したらシナリオを表示し,ボタン入力されると次々とメッセージが表示される。
main関数で x, yに現在位置を持たせているので,それを元に判定を行なう。
void rSinario(int x, int y){
/*シナリオ判定*/
switch (y){
case 19:
switch (x){
case 21:
rMsgText("扉を通り抜けて家の中に入った。▼");
rMsgText("");
rMsgText("");
key_wait();
break;
}
break;
}
}
これで,横21の縦19位置に移動すると,メッセージを表示して,ボタン入力待ちになる。
あとは,main関数から呼び出すだけだ。
void main(void){
unsigned short hRet;
int x, y;
font_set_colordata(100, 1, bmp_space);
screen_fill_char(SCREEN2, 0, 0, 28, 18, 100);
rWaku();
rSetMapC();
x=38;
y=19;
for ( ; ; ){
rMapView(x, y);
rSinario(x, y);
hRet=rKeyin();
switch (hRet){
case cBOT_X1:
if (md[(y - 1) * 50 + x] % 2 == 0)
y--;
break;
case cBOT_X2:
if (md[y * 50 + (x + 1)] % 2 == 0)
x++;
break;
case cBOT_X3:
if (md[(y + 1) * 50 + x] % 2 == 0)
y++;
break;
case cBOT_X4:
if (md[y * 50 + (x - 1)] % 2 == 0)
x--;
break;
case cBOT_START:
goto EndJump;
break;
}
}
EndJump:;
}
・フラグを持たせる
このままでは,同じ場所へ移動すると何度も同じ事を表示します。
そこで,各シナリオにフラグを持たせるようにします。
スピ魅には,日付の概念があり(こんなゲームでもあるのですよ(^^;),その判定も行なう必要があります。
シナリオフラグと日付は,グローバル変数に定義する事にします。
unsigned char gSinarioFlag[7];
unsigned char gHidukeFlag;
void rSinario(int x, int y){
/*シナリオ判定*/
switch (gHidukeFlag){
case 1:
switch (y){
case 19:
switch (x){
case 21:
if (gSinarioFlag[0]){
rMsgText("扉を通り抜けて家の中に入った。▼");
rMsgText("");
rMsgText("");
key_wait();
gSinarioFlag[0]=0;
}
break;
}
break;
}
}
}
かなり入れ子になりましたが,判定を行なっている順番を把握すれば,とくに複雑では無いでしょう。
とにかくプログラミングは,後で分かり易いように書く事が重要です。
また,main関数にフラグ初期化処理を加える事も忘れてはなりません。
gHidukeFlag=1;
for(i=0; i < 8; i++){
gSinarioFlag[i]=1;
}
これでまだ終りではありません。
日付を進める処理を加える必要があります。
void rSinario(int x, int y){
/*シナリオ判定*/
int i, flagall;
switch (gHidukeFlag){
case 1:
switch (y){
case 19:
switch (x){
case 21:
if (gSinarioFlag[0]){
rMsgText("扉を通り抜けて家の中に入った。▼");
rMsgText("");
rMsgText("");
key_wait();
gSinarioFlag[0]=0;
}
break;
}
break;
}
}
/*日付を進める処理*/
flagall=0;
for (i=0; i < 8; i++){
flagall += gSinarioFlag[i];
}
if (flagall == 0){
gHidukeFlag++;
for (i=0; i < 8; i++){
gSinarioFlag[i]=1;
}
}
}
全てのシナリオフラグが落ちた時に日付を進めます。
・まとめ
後はガツンと,シナリオを組込むだけです。
この部分は WonderWitchと直接関係は無いので,深く追求はしません。
長いですが,シナリオソースです。
void rSinario(int x, int y){
/*シナリオ判定*/
int i, flagall;
switch (gHidukeFlag){
case 1:
switch (y){
case 14:
switch (x){
case 27:
if (gSinarioFlag[1]){
rMsgText("なんだか目が点になる程に散らかっ");
rMsgText("ている。 ▼");
rMsgText("");
key_wait();
rMsgText("異臭がすると言っても過言では無い");
rMsgText("誰もいないようだが,人が住んでい");
rMsgText("る気配はある。 ▼");
key_wait();
rMsgText("どんな人が住んでいるんだろう?と");
rMsgText("思いながら外へ出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[1]=0;
} else {
rMsgText("相変らず散らかっている。");
rMsgText("とても人間が住んでいるとは思えな");
rMsgText("い。 ▼");
key_wait();
rMsgText("これ以上居ても仕方が無いので外に");
rMsgText("出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
}
break;
case 33:
if (gSinarioFlag[3]){
rMsgText("おばあさんが窓の外の通りを見てい");
rMsgText("る。");
rMsgText("近づくと,ふとこちらを見た。 ▼");
key_wait();
rMsgText("一瞬私の事が見えるのかと思ったが");
rMsgText("すぐに通りへと目線を戻した。 ▼");
rMsgText("");
key_wait();
rMsgText("何だか得体の知れない感じのするお");
rMsgText("ばあさんだ。");
rMsgText("そう思いながら外に出た。 ▼");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[3]=0;
} else {
rMsgText("相変らず外を眺めている。");
rMsgText("何かあるのだろうか? ▼");
rMsgText("");
key_wait();
rMsgText("横に並んで外を見てみるが,草原が");
rMsgText("広がるだけである。 ▼");
rMsgText("");
key_wait();
rMsgText("何を見ているのだろうか?と思いな");
rMsgText("がら外に出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
}
break;
case 37:
if (gSinarioFlag[5]){
rMsgText("父と娘,息子がゴロゴロしている。");
rMsgText("本当にゴロゴロと寝そべっているだ");
rMsgText("けだ。 ▼");
key_wait();
rMsgText("得に何も起りそうにないので外に出");
rMsgText("た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[5]=0;
} else {
rMsgText("どうやらゴロゴロとしている間に眠");
rMsgText("ってしまったようだ。 ▼");
rMsgText("");
key_wait();
rMsgText("スヤスヤと寝息を立てて3人仲良く");
rMsgText("眠っている。 ▼");
rMsgText("");
key_wait();
rMsgText("(とくに音は立たないのだが)そっ");
rMsgText("と外に出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
}
break;
}
break;
case 19:
switch (x){
case 21:
if (gSinarioFlag[0]){
rMsgText("扉を通り抜けて家の中に入った。▼");
rMsgText("");
rMsgText("");
key_wait();
rMsgText("他の家より大きい(見た目は同じ様");
rMsgText("だが,奥行が長いと思って下さい)");
rMsgText("ので人がいっぱい住んでいるのか▼");
key_wait();
rMsgText("と思えば,老人が一人ベビーいすに");
rMsgText("座っているだけだった。 ▼");
rMsgText("");
key_wait();
rMsgText("スピ魅「あのおじいちゃん,なにし");
rMsgText("てんのかなぁ?」 ▼");
rMsgText("");
key_wait();
rMsgText("そっと近づいてみる(別に見えない");
rMsgText("のだから,堂々と近づけば良いのだ");
rMsgText("が) ▼");
key_wait();
rMsgText("おじいさん「フォッフォッフォッ」");
rMsgText("何が面白いのかは分からないが笑っ");
rMsgText("ている。 ▼");
key_wait();
rMsgText("スピ魅「?」");
rMsgText("しばらく見ていたが,ずっとそのま");
rMsgText("まなので,外に出ることにした。▼");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[0]=0;
} else {
rMsgText("おじいさん「フォッフォッフォッ」");
rMsgText("相変らず笑っている。 ▼");
rMsgText("");
key_wait();
rMsgText("ここにいても仕方が無いので,外に");
rMsgText("出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
}
break;
}
break;
case 25:
switch (x){
case 26:
if (gSinarioFlag[2]){
rMsgText("なんだか暗い雰囲気だ。 ▼");
rMsgText("");
rMsgText("");
key_wait();
rMsgText("母親と娘がすすり泣いていて,父親");
rMsgText("は黙って腕組みをして目を閉じてい");
rMsgText("る。 ▼");
key_wait();
rMsgText("一体何があったのかなぁ?と思いな");
rMsgText("がら外に出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[2]=0;
} else {
rMsgText("あれ?父親がいなくなっている。");
rMsgText("相変らず母親と娘はすすり泣いてい");
rMsgText("る。 ▼");
key_wait();
rMsgText("理由を知りたいが,話かける事は出");
rMsgText("来ないので外に出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
}
break;
case 31:
if (gSinarioFlag[4]){
rMsgText("ワンワン!!");
rMsgText("家に入ると突然ほえられた。 ▼");
rMsgText("");
key_wait();
rMsgText("この犬には私の事が見えているらし");
rMsgText("い。 ▼");
rMsgText("");
key_wait();
rMsgText("飛びかかって来たので,驚いて飛び");
rMsgText("退いた。 ▼");
rMsgText("");
key_wait();
rMsgText("でもよく考えたら幽霊なのだからか");
rMsgText("まれる心配は無いのだった。");
rMsgText("犬にアカンベーをして外に出た。▼");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[4]=0;
} else {
rMsgText("相変らずバカ犬が飛びかかって来た");
rMsgText(" ▼");
rMsgText("");
key_wait();
rMsgText("今度は無視してそのまま立って(浮");
rMsgText("いて)いると,すり抜けて後ろの壁");
rMsgText("に撃突した。 ▼");
key_wait();
rMsgText("やっぱりバカ犬だと思いながら外に");
rMsgText("出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
}
break;
case 35:
if (gSinarioFlag[6]){
rMsgText("入るととても広い家だった(実は広");
rMsgText("い地下室があるとでも思って下さい");
rMsgText("。) ▼");
key_wait();
rMsgText("宿屋として使っているらしく,カウ");
rMsgText("ンター等も設置してある。 ▼");
rMsgText("");
key_wait();
rMsgText("今は泊まり客はいないようだ。");
rMsgText("特に気になる物は無いので外に出た");
rMsgText("。 ▼");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[6]=0;
}
break;
}
break;
}
break;
case 2:
switch (y){
case 14:
switch (x){
case 27:
if (gSinarioFlag[1]){
rMsgText("昨日よりいっそう汚くなっている。");
rMsgText("まるでドロボウが入ったようなあり");
rMsgText("さまだ。 ▼");
key_wait();
rMsgText("……でも前とあまり変わり無いとも");
rMsgText("言える。 ▼");
rMsgText("");
key_wait();
rMsgText("散々探した後のようで,これ以上私");
rMsgText("が探す事も無いので外に出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[1]=0;
}
break;
case 33:
if (gSinarioFlag[3]){
rMsgText("こういう事件が起きると,こうして");
rMsgText("いつも外を見ている人が最も頼りに");
rMsgText("なる…… ▼");
key_wait();
rMsgText("と思ったが,近づいてみると寝てい");
rMsgText("る。 ▼");
rMsgText("");
key_wait();
rMsgText("いつも外を見ていると思っていたが");
rMsgText("実は寝ていただけなのかも知れない");
rMsgText("あきれてその場を立ち去った。 ▼");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[3]=0;
}
break;
case 37:
if (gSinarioFlag[5]){
rMsgText("いつもゴロ寝している家族だが,今");
rMsgText("日は総出で探すのを手伝っているよ");
rMsgText("うだ…… ▼");
key_wait();
rMsgText("と思ったが草むらの中で1人寝てい");
rMsgText("る。 ▼");
rMsgText("");
key_wait();
rMsgText("全員寝てしまうのも時間の問題だろ");
rMsgText("う。 ▼");
rMsgText("");
key_wait();
rMsgText("この家族にはつき合ってられないの");
rMsgText("で,その場を離れた。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[5]=0;
}
break;
}
break;
case 19:
switch (x){
case 21:
if (gSinarioFlag[0]){
rMsgText("おじいさん「フォッフォッフォッフ");
rMsgText("ォッ」 ▼");
rMsgText("");
key_wait();
rMsgText("昨日と同じように笑っているだけだ");
rMsgText("どうも○○(自主規制しました)て");
rMsgText("いるようだ。 ▼");
key_wait();
rMsgText("ここには無いようなので外に出た。");
rMsgText(" ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[0]=0;
}
break;
}
break;
case 25:
switch (x){
case 26:
if (gSinarioFlag[2]){
rMsgText("相変らず暗い親子がいる。");
rMsgText("娘は今日も泣いている。 ▼");
rMsgText("");
key_wait();
rMsgText("父親と母親は家の周囲をウロウロし");
rMsgText("ている。 ▼");
rMsgText("");
key_wait();
rMsgText("気を粉らわす為に探しているようだ");
rMsgText("娘の事は気になるが外に出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[2]=0;
}
break;
case 31:
if (gSinarioFlag[4]){
rMsgText("あれ?バカ犬がいない。");
rMsgText("バカ犬のことなんてどうでも良いの");
rMsgText("で,その場を去った。 ▼");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[4]=0;
}
break;
case 35:
if (gSinarioFlag[6]){
rMsgText("建物に入るとカウンターに相変らず");
rMsgText("人がいない。 ▼");
rMsgText("");
key_wait();
rMsgText("おや?通路に人影があるぞ?");
rMsgText("どうやら旅人が訪れたようだ。 ▼");
rMsgText("");
key_wait();
rMsgText("ウロウロしている。誰もいなくて困");
rMsgText("っているようだ。 ▼");
rMsgText("");
key_wait();
rMsgText("スピ魅にはどうする事も出来ないの");
rMsgText("で,外に出た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
gSinarioFlag[6]=0;
} else {
rMsgText("あ,バカ犬がいる。");
rMsgText("相変らずバカ犬がほえて来た。 ▼");
rMsgText("");
key_wait();
rMsgText("フワフワ浮いてからかっていると,");
rMsgText("キラリと光る物が見えた。 ▼");
rMsgText("");
key_wait();
rMsgText("あった!村人が探しているペンダン");
rMsgText("トだ!");
rMsgText("バカ犬が持って来ていたんだ。 ▼");
key_wait();
rMsgText("スピ魅「どうやって村人に教えよう");
rMsgText("かな?」 ▼");
rMsgText("");
key_wait();
rMsgText("普通の人間には見えないスピ魅には");
rMsgText("どうしようもない。 ▼");
rMsgText("");
key_wait();
rMsgText("そう考えていると,バタンと扉が開");
rMsgText("いて男が飛び込んで来た。 ▼");
rMsgText("");
key_wait();
rMsgText("男「タラム!おまえか!大切なペン");
rMsgText("ダントを盗んだのは!」 ▼");
rMsgText("");
key_wait();
rMsgText("……と言ったかと思うと,バカ犬に");
rMsgText("飛びげりをかましてボディにアッパ");
rMsgText("ーをくり出した。 ▼");
key_wait();
rMsgText("バカ犬はボロボロになって窓の外ま");
rMsgText("で吹き飛んでいった。 ▼");
rMsgText("");
key_wait();
rMsgText("男は大事そうにペンダントを拾うと");
rMsgText("家の外へ出て行った。 ▼");
rMsgText("");
key_wait();
rMsgText("スピ魅は突然の事にぼうぜんとして");
rMsgText("しまった。");
rMsgText("しばらくしてスピ魅は外に出た。▼");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
/*このシナリオを見るとフラグが全て落ちる*/
for (i=0; i < cSinarioMax; i++){
gSinarioFlag[i]=0;
}
}
break;
}
break;
}
}
/*日付を進める処理*/
flagall=0;
for (i=0; i < cSinarioMax; i++){
flagall += gSinarioFlag[i];
}
if (flagall == 0){
gHidukeFlag++;
/*日付が変わった時のシナリオ*/
switch (gHidukeFlag){
case 1:
rMsgText("呪いの言葉ここにあり……");
rMsgText(" 伝わりし者、");
rMsgText(" 今ここに……いつもここに……▼");
key_wait();
rMsgText("");
rMsgText(" 呪言伝承伝 外伝");
rMsgText(" ▼");
key_wait();
rMsgText("Guardian Angel");
rMsgText(" スピ魅 Part1");
rMsgText(" ▼");
key_wait();
rMsgText("《第 1 章》");
rMsgText(" −− 省 略 −−");
rMsgText(" ▼");
key_wait();
rMsgText("《第 2 章》");
rMsgText("……と言う理由でスピ魅は死んだ。");
rMsgText(" ▼");
key_wait();
rMsgText("こんなささいな事で人が死ぬとは,");
rMsgText("誰も思わなかった。 ▼");
rMsgText("");
key_wait();
rMsgText("けれど,スピ魅はこれで良かったと");
rMsgText("思った。 ▼");
rMsgText("");
key_wait();
rMsgText("生きているよりは楽になれると思っ");
rMsgText("た。 ▼");
rMsgText("");
key_wait();
rMsgText("スピ魅「なんなのよ一体?」");
rMsgText("死界でポツリとつぶやいた。 ▼");
rMsgText("");
key_wait();
rMsgText("本来,まだ死ぬ予定では無かった為");
rMsgText("生まれかわる事が出来ないと言われ");
rMsgText("たのだ。 ▼");
key_wait();
rMsgText("スピ魅「ま,いっか。」");
rMsgText("まぁいい事に決めた。 ▼");
rMsgText("");
key_wait();
rMsgText("死界でフワフワと暮らしていると,");
rMsgText("何かが近づいて来た。 ▼");
rMsgText("");
key_wait();
rMsgText("?「スピ魅さん。暇だったら手伝っ");
rMsgText("て頂けませんか?」 ▼");
rMsgText("");
key_wait();
rMsgText("どこから見ても童話に出て来るよう");
rMsgText("な天使の格好をした娘だ。 ▼");
rMsgText("");
key_wait();
rMsgText("スピ魅「まぁ,暇だからいいけど」");
rMsgText("天使の格好をした娘「まあ!……言");
rMsgText("ってみるものですね。」 ▼");
key_wait();
rMsgText("スピ魅「え?……。」");
rMsgText("天使の格好をした娘「あ……いえ,");
rMsgText("何でもございませんわ。」 ▼");
key_wait();
rMsgText("なんだか良く分からないけれど,天");
rMsgText("使の手伝いをする事になった。 ▼");
rMsgText("");
key_wait();
rMsgText("スピ魅は最初なので,村をただ見護");
rMsgText("るだけの仕事を与えられた。 ▼");
rMsgText("");
key_wait();
rMsgText("スピ魅は守護霊となって,元の世界");
rMsgText("へと戻って来た。 ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
break;
case 2:
rMsgText("");
rMsgText("そして次の日");
rMsgText("");
key_wait();
rMsgText("ある村人が大切なハート型ペンダン");
rMsgText("トを失くしたらしい。 ▼");
rMsgText("");
key_wait();
rMsgText("村人みんなで探し始めるのだが……");
rMsgText(" ▼");
rMsgText("");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
break;
case 3:
rMsgText("");
rMsgText("そして次の日");
rMsgText("");
key_wait();
rMsgText("村の護り神の怒りを鎮める為に,村");
rMsgText("の娘を生け贄に差し出すと言う。▼");
rMsgText("");
key_wait();
rMsgText("村人は皆,神を恐れて家に閉じこも");
rMsgText("っている。 ▼");
rMsgText("");
key_wait();
/*マップ移動*/
rMapView(26, 25);
rMsgText("娘は美しい服を着せられていた。");
rMsgText("");
rMsgText("");
key_wait();
rMsgText("もうあきらめたのか,泣き尽くした");
rMsgText("のか,今日は笑みさえ浮かべている");
rMsgText(" ▼");
key_wait();
rMsgText("付きそいで,昨日バカ犬をブッ飛ば");
rMsgText("した男がいっしょに行くようだ。");
rMsgText("あのパワーなら安心だろう。 ▼");
key_wait();
rMsgText("");
rMsgText("");
rMsgText("");
break;
}
/*シナリオフラグを立て直す*/
for (i=0; i < cSinarioMax; i++){
gSinarioFlag[i]=1;
}
}
}
void main(void){
unsigned short hRet;
int x, y;
int i;
font_set_colordata(100, 1, bmp_space);
screen_fill_char(SCREEN2, 0, 0, 28, 18, 100);
rWaku();
rSetMapC();
gHidukeFlag=0;
for(i=0; i < cSinarioMax; i++){
gSinarioFlag[i]=0;
}
x=38;
y=19;
for ( ; ; ){
rMapView(x, y);
rSinario(x, y);
hRet=rKeyin();
switch (hRet){
case cBOT_X1:
if (md[(y - 1) * 50 + x] % 2 == 0)
y--;
break;
case cBOT_X2:
if (md[y * 50 + (x + 1)] % 2 == 0)
x++;
break;
case cBOT_X3:
if (md[(y + 1) * 50 + x] % 2 == 0)
y++;
break;
case cBOT_X4:
if (md[y * 50 + (x - 1)] % 2 == 0)
x--;
break;
case cBOT_START:
goto EndJump;
break;
}
}
EndJump:;
}