#author("2023-03-26T15:28:58+09:00","default:post","post")
#author("2023-11-11T07:17:20+09:00","default:post","post")
選択肢。選択肢関連の技とか。

----
#contents
----
~

*里々の書式 [#o854c5fa]

バルーンに選択肢を表示してユーザーに選択させたい場合等に使用します。~
里々の書式の選択肢では表現に制限があるのでより細かく指定したい場合は後述のさくらスクリプトによる選択肢を参照して下さい。

 *
 :選択して下さい。
 
 _選択肢1
 _選択肢2
 
 *選択肢1
 :選択肢1が選ばれました。
 
 *選択肢2
 :選択肢2を選んだみたい。
 
 *選択肢2
 :選択肢2を選んだんだよ。

_は行頭に書く必要があります。選択肢のジャンプ先が複数ある場合はランダムで選ばれます。~
この書式では選択肢の表示とジャンプ先のトーク名が同じになるので[はい]/[いいえ]の様な選択がいくつもある場合ではジャンプ先が同じになってしまうのでジャンプ先の名前を変えたい場合は次の様に書きます。

 _選択ラベル1【タブ】選択ID1

この場合クリックできる文章が『選択ラベル1』のまま、『*選択ID1』にジャンプします。~

また選択肢トークを実行した後は[[次の変数に値が保持されます>情報取得変数#f9381675]]。
 (選択ID)
 (選択ラベル)
 (選択番号)

*さくらスクリプトの書式 [#pc4f2ab3]
選択肢はさくらスクリプトを直接記入する方法もあります。~
(里々の書式も、ベースウェアに送る際に里々が自動でさくらスクリプトの書式に変換している)~
こちらの方が応用がきくので、ゴースト制作に慣れてきたらぜひ使ってみよう。

 _選択ラベル【タブ】選択ID

 \q[選択ラベル,選択ID]

 \__q[選択ID]選択ラベル\__q

一番上は里々の書式で、二番目・三番目がさくらスクリプトによる書式になります。((三番目の\__qはアンダーバーが2つなことに注意。))~
それぞれどのように対応しているか分かるはず。~
以下使用例。

 *
 :選択して下さい。
 
 \q[選択ラベル1,選択ID1]
 \q[選択ラベル2,選択ID2]

**段落点を表示する [#v44ccd3f]
さくらスクリプトの\![*]はSSTPマーカーを表示します。~
これを段落点の代わりにして、選択肢の頭に付ければちょっとかっこよくなるかも?~

 *
 :選択して下さい。
 
 \![*]\q[選択ラベル1,選択ID1]
 \![*]\q[選択ラベル2,選択ID2]

**引数を与える [#see77684]
選択後はジャンプ先に引数を渡すこともできます。

-Onを使う~
選択IDの先頭をOnで書き始めると、独自のイベント名に飛びつつ引数を利用できます。~
こちらは選択後トークにR0以降のReferenceで引数を参照します。

 \q[選択ラベル,On選択ID,引数1,引数2] または \__q[On選択ID,引数1,引数2]選択ラベル\__q
 
 *On選択ID
 :引数1は(R0)です、引数2は(R1)です。

-OnChoiceSelectExを使う~
SHIORIイベントのOnChoiceSelectExは\qタグ内の三番目以降の情報をR2以降で通知します。~
(なお通常のOnChoiceSelectとExとではR0とR1の内容が逆なので注意)

 *OnChoiceSelectEx
 >(R1)
 
 *例
 \__q[選択ID,引数1,引数2]選択ラベル\__q
 
 *選択ID
 :引数1は(R2)です、引数2は(R3)です。

なお里々では[[独自仕様>里々の内部処理]]により\qタグの内容を加工するため、OnChoiceSelectExで引数を与えたい時は\__q[]~\__qの方を使います。


*応用テクニック [#s95cd0f1]

**選択肢の並びをランダムにする [#m6a3b9c8]
デフォルトの設定では、1回のトーク中で複数回同名単語群を呼び出しても、単語は重複して選択されない。

 *クイズ開始
 :さて、ここで問題です。
 デスパコーワとは何の薬でしょう。
 
 _(回答肢)
 _(回答肢)
 _(回答肢)
 
 @回答肢
 口内炎
 頭痛
 歯痛
 
 *口内炎
 :正解!
 
 *頭痛
 :ハズレ!
 
 *歯痛
 :ハズレ!

**2段組メニュー [#dc10653c]
里々では、今のところ2段組のメニューは作成できない。~
実装する場合は、さくらスクリプトを使用して、次のようにする。 

 \q[選択ラベル1,選択ID1] \q[選択肢ラベル4,選択ID4]
 \q[選択ラベル2,選択ID2] \q[選択肢ラベル5,選択ID5]
 \q[選択ラベル3,選択ID3]

またはカーソル移動の ¥_l タグを利用して
 \q[選択ラベル1,選択ID1] 
 \q[選択ラベル2,選択ID2] 
 \q[選択ラベル3,選択ID3]
 \_l[,@-70]
 \_l[160,]\q[選択ラベル4,選択ID4]
 \_l[160,]\q[選択ラベル5,選択ID5]
¥_l[,@-70]の-70の数値は、戻りたい行数×14で計算

**条件を満たしたら選択肢を表示 [#wdf02216]
最初は隠しておきたい選択肢などの表現方法。

 *例
 :メニューだよ。
 \q[選択ラベル1,選択ID1]
 \q[選択ラベル2,選択ID2]
 (when,(好感度)>=10,\q[選択ラベル3,選択ID3])

[[関数]]のwhenを使い、(好感度)が10以上の時だけ選択ラベル3を追加で表示します。~
なお注意点ですが、\qタグ内ですでに半角コンマを使っているため、関数の引数区切りには半角コンマを使ってはいけません。~
例のように全角コンマなど別の区切り文字を使いましょう。


*選択肢の自動化 [#f3536a8e]
丸投げ→[[駄でべ sissy/選択肢の自動選択>http://emily.shillest.net/specwiki/index.php?sissy%2F%E9%81%B8%E6%8A%9E%E8%82%A2%E3%81%AE%E8%87%AA%E5%8B%95%E9%81%B8%E6%8A%9E]]
丸投げ→[[駄でべ sissy/選択肢の自動選択>https://emily.shillest.net/specwiki/index.php?sissy%2F%E9%81%B8%E6%8A%9E%E8%82%A2%E3%81%AE%E8%87%AA%E5%8B%95%E9%81%B8%E6%8A%9E]]

-SSP専用になっても良いなら、さくらスクリプトの timerraise コマンドを使うと楽チン。
-指定された制限時間を過ぎると自動的に特定のラベルを選択したという事にして強制的にジャンプさせられる。

 # パラメータは \![timerraise,制限時間(ms),1(固定),ジャンプしたいラベル]
 
 *おやつ裁判
 :(7)被告に一週間お犬様の世話を命ずる。
 _異議あり!
 _異議ありません
 \![timerraise,5000,1,異議ありません]



*選択肢の表示条件 [#p6e938c2]
回りくどい気もします。

 #「選択肢」は、重複回避のためだけなので、つけなくても変えても構いません。
 
 *見たものリスト
 :今まで見たものだよー
 \q[(見たもの1フラグ),選択肢(見たもの1フラグ)]\_q
 \q[(見たもの2フラグ),選択肢(見たもの2フラグ)]\_q
 ・
 ・
 ・
 
 *選択肢見たもの1
 :こんなのあったねー。
 
 #「見たもの1フラグ」という文字は、選択肢に表示する文字に置き換えて下さい。
 #他も同様です。
 
 *見たもの1フラグ立て
 $見たもの1フラグ【タブ】見たもの1
 :見たものリストに追加しておくねー

*頁切替式選択メニュー [#mc4d2464]
不特定数の選択肢を次頁・前頁で行き来出来る選択メニューです。~
例はインストールゴーストをリスト表示して選択出来ます。~

installedghostname通知でゴースト名を配列変数_aryGhostNameに入れて置く
 *installedghostname
 (for,0,(Rの数)-1,(set,_aryGhostName(C0),(R(C0))))
 _aryGhostName(Rの数)【タブ】

メニュー本体
 #頁最大行数と表示開始頁数設定
 *GhostMenu
 $_PMax【タブ】22
 $_Page【タブ】0
 >GhostMenu.2
 
 #ヘッダー処理
 *GhostMenu.2
 $_i【タブ】1
 $スクリプトの一番頭【タブ】\C
 \0\_q\c\b[2]■ゴースト選択メニュー\n[50]
 >GhostMenu.loop
 
 #ループ処理(選択肢表示)
 *GhostMenu.loop
 $_j【タブ】(calc,(_i)+(_Page)*(_PMax)-1)
 $_f【タブ】(変数「_aryGhostName(_j)」の存在)
 >GhostMenu.loopend【タブ】(_i)>(_PMax)||(_f)==0
 \0\__q[OnGhostMenuSelect,(_j)](_aryGhostName(_j))\__q
 $_i【タブ】(calc,(_i)+1)
 >GhostMenu.loop
 
 #フッター処理
 *GhostMenu.loopend
 \0(when,(_i)==1,(set,_i,2)\0...登録はありません\n)φ
 (when,(_i)<=(_PMax),(times,(calc、(_PMax)-(_i)+1), \n))φ
 \n[half]\![*]\q[閉じる,GhostMenu.close] φ
 (if、(_Page)>0||(_i)>(_PMax)&&(_f)==1、\![*](if、(_Page)>0、\q[前頁,GhostMenu.prior]、前頁/)φ
 (if、(_Page)>0&&(_i)>(_PMax)&&(_f)==1、/)φ
 (if、(_i)>(_PMax)&&(_f)==1、\q[次頁,GhostMenu.next]))
 
 #閉じる
 *GhostMenu.close
 
 #前頁
 *GhostMenu.prior
 $_Page【タブ】(calc,(_Page)-1)
 >GhostMenu.2
 
 #次頁
 *GhostMenu.next
 $_Page【タブ】(calc,(_Page)+1)
 >GhostMenu.2
 
 #選択時  
 *OnGhostMenuSelect
 \![call,ghost,(_aryGhostName(R0))]

解説~
-変更して使用する時は、ループ処理の表示部分と選択時処理を触るだけで良いです。(文のラベル名とか配列変数名とかは除く)
-installedghostnameの最後に_aryGhostName(Rの数)へ空白を代入してるのは配列の最後+1を確実に存在させない為です、ループ処理で配列の終わりを存在しないかどうかで判定している為。~
(ヌルで終わる文字列的な、配列の数を変数で管理しなくて良いので)
-ヘッダー処理で「$スクリプトの一番頭」で「&yen;C」を使ってるのは高速表示のためです、無いと頁移動時の表示が少し遅い。多分「&yen;C」の想定外の使い方、何時か使用できなくなるかも。
-使用している変数名の頭の_は、yaya as saoriサンプルの[[ワーク変数自動削除>SAORI/YAYA#pd38cb7b]]対応変数名です、自動削除サンプル入れて無くてもこの頁切替式選択メニューサンプルの動作には問題ないです。(セーブデータには一杯ゴミが残りますが…)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS