YU-RIS サポート掲示板

0249 どうもです(^^
投稿者:たくみ 2005/07/13(水) 01:36

あきらさんどうもです(^^
遅レスすみません;;

> さてセーブ機能についてなのですが、今のところステータスを
> セーブするだけで文章の読み込み位置を記録することはできない
> わけなのですよね。

現状だとまだそうですね。本当に申し訳ないです;

> if文をそのまま利用する形で分岐する場合(と言いますか私は面倒くさい
> のでいちいちラベル名を考えるよりもダイレクトにif節で分岐したい派
> なのですけれども)、ファイルの先頭で該当メッセージにジャンプする
> 場合、if節の外部から、if節の中にgoで移動してしまうというとてつもない
> 荒技を使わなくてはなりません。
> このようなプログラムをyu-risのシステム側で保証することは
> できますでしょうか。さらにifbreakやifcontinueなどを、まあ普通の
> ノベル形式のゲームで使うことはあり得ませんけれども、そういった
> 部分の動作も確実にできますでしょうか。

はい。保証されますです。例えば、
--------------------------------
GO[#=LABEL1]
END[]
IF[1==1]
  #LABEL1
  我が輩はねこっぽい。
IFEND[]
--------------------------------
などと書いても大丈夫です(^^
そのあたりはCの基準に沿わせました。

> ただif節中でさらに選択肢でif分岐する時にラベルを
> 使うと非常に面倒くさいのでできれば使いたくないのは本音です(汗)。

なるほど。
ただその場合の書き方の制限として、IFのネスト(IFの中にIF)が16個まで
というのがありますので、もしたくさんIFネストするようであれば、
それに引っかからないように(IFネストしないで記述するように)しなくては
ならないですね。
例えば、どの選択肢を選んだかを各選択肢毎に用意した変数に保存しておいて、
各値を参照して分岐するような形でIFを使えばネストしなくても書けると思います。
参考までに記述してみますと…。

---------------------------------------------------------------------------

我が輩はねこっぽい。
さて、なにをしよう。

GOSUB[#=選択肢A] // 選択肢処理A「1:出かける」「2:食べる」

//============================================ 選択肢Aの分岐処理
IF[@SEL_A==1] // 選択肢Aで選択肢1を選んだら
  どこへ?
  GOSUB[#=選択肢B] // 選択肢処理B「1:駅前」「2:公園」
ELSE[@SEL_A==2] // 選択肢Aで選択肢2を選んだら
  なにを?
  GOSUB[#=選択肢C] // 選択肢処理C「1:寿司」「2:ラーメン」
IFEND[]

//============================================ 選択肢Bの分岐処理
//選択肢Bを実行していない場合(選択肢Aで選択肢2を選んだ場合)は、
//@SEL_Bの値は0なので、ここの分岐処理は通らないことになり、※1へ
IF[@SEL_B==1] // 選択肢Bで選択肢1を選んだら
  駅前へでかけた。つづく…
ELSE[@SEL_B==2] // 選択肢Bで選択肢2を選んだら
  公園へ向かった。つづく…
IFEND[]
//※1

//============================================ 選択肢Cの分岐処理
//選択肢Cを実行していない場合(選択肢Aで選択肢1を選んだ場合)は、
//@SEL_Cの値は0なので、ここの分岐処理は通らないことになり、※2へ
IF[@SEL_C==1] // 選択肢Bで選択肢1を選んだら
  寿司を注文した。つづく…
ELSE[@SEL_C==2]
  ラーメンを注文した。このあと大変な事態に…
IFEND[]
//※2

---------------------------------------------------------------------------

ひとまずこんな感じですが、これですとシナリオの流れが分かりづらく
なってしまうかもしれません…(^^;
まぁでも、分岐してもすぐに合流するようなシナリオならば
(IFネストが16個もいかないような分岐ならば)普通にネストして記述しても
問題ないと思います(^^

根本的にただ、実際のところ現状ではジャンプ命令で飛べる先がラベルでないと
いけないので、任意のテキストの場所に飛ぶ、ということが出来ません…。
なので、なんとか現状で実現させるとするなら、
シナリオをたとえば段落毎に区切って、段落毎にラベルを作っておきまして、
現在どこの段落を実行しているかを表すフラグ変数を保持しておきます。
で、セーブでそれを保存しておいて、
ロードする時は、その変数の値を調べて各ラベルへ飛ばせる処理をさせる、
というのが現実的でしょうか。
ただ段落毎ですので、段落の最後のほうでセーブしてもロード時には
また段落の最初からになってしまいますけど…;

こんなところでしょうか。参考になれば幸いです。
あと現在更新が停滞してしまっていてすみません。
次の Ver0.165 は7/17更新になります。
もうしばらくお待ち下さいませ。


- 関連一覧ツリー (■ をクリックするとツリー全体を一括表示します)