#author("2023-03-23T10:44:20+09:00","default:post","post")
#author("2023-11-11T07:21:53+09:00","default:post","post")
*名前を覚えさせる [#n78329d8]

ユーザの名前を覚えさせる方法の紹介。~

----
#contents
----
~

*インプットボックスを使う [#y27e996e]
さくらスクリプトの&color(blue){\![open,inputbox,ID]};を使い、ユーザに入力を促すやり方。~
前提として辞書のどこかにOnUserInputに対応する記述が必要です。テンプレートゴーストならたぶん既にあるはず。~

 *OnUserInput
 $(R0)【タブ】(R1)
 >(R0)を教えてもらった

参考リンク [[UKADOC-さくらスクリプトリスト:http://ssp.shillest.net/ukadoc/manual/list_sakura_script.html#_!_open,inputbox,ID,%E8%A1%A8%E7%A4%BA%E6%99%82%E9%96%93,%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88,%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3,..._]]
参考リンク [[UKADOC-さくらスクリプトリスト:https://ssp.shillest.net/ukadoc/manual/list_sakura_script.html#_!_open,inputbox,ID,%E8%A1%A8%E7%A4%BA%E6%99%82%E9%96%93,%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88,%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3,..._]]

**基本形 [#j51df8cd]

 *名前を変える
 :名前は?\![open,inputbox,ユーザ名]
 
 *ユーザ名を教えてもらった
 :(ユーザ名)だね。

基本はこれで、変数「ユーザ名」に入力した内容が保存されます。~

//さくらスクリプトのオプションで、予めボックスに文字列を入れておく事もできます。
// #インプットボックスに予め「ユーザ太郎」と入れておく方法
//  \![open,inputbox,ユーザ名,,ユーザ太郎]
//↑下の「名前入力の空エンター・キャンセル対策」に統合しました。


**読み方も教えてもらう [#ed278d20]
名前を入力した後に、続いて読み方も求める方法。

 *名前を変える
 :名前は?\![open,inputbox,ユーザ名]
 
 *ユーザ名を教えてもらった
 :(ユーザ名)だね。
 読み方も教えて欲しいな。全角のひらがなで頼む。
 \![open,inputbox,ユーザ読み仮名]
 
 *ユーザ読み仮名を教えてもらった
 :(ユーザ読み仮名)だね。ありがと。


*名前入力の空エンター・キャンセル対策 [#nd426369]
入力ボックスに何もせずエンター(空エンター)したり、ボックスの[×]ボタンで閉じたとき、場合によってはイベントがそこで止まってしまう可能性があります。~
ここではそれを防ぐために、名前入力の時の空エンターを無理やり弾く例を挙げます。~

**初期値を入れておく [#hdfffdd3]
satori_conf.txtで初期値をセットしておけば、空エンターをされた時は名前を変更しなければいい事になります。

 $ユーザ名【タブ】ユーザー

そして入力ボックスを開くスクリプトは以下のように。

 \![open,inputbox,名前の入力,,(ユーザ名)]

こうしておくと、入力ボックスを開いた時に「ユーザー」が、その後ユーザ名を変更したならその名前が最初から表示されるようになります。~
面倒で入力せずエンター押すユーザーさん向け。~
また、初期値がなくてもインプットボックスに文字を入れておくこともできます。~

 #インプットボックスに予め「ユーザ太郎」と入れておく方法
 \![open,inputbox,ユーザ名,,ユーザ太郎]


**SSPで設定された情報を活用する [#u9f9ee02]
SSPの本体設定にはユーザーの名前をあらかじめ設定することができます。~
初回起動の時、もしユーザーがこれを利用していたなら、そちらを参照するテクニック。~
OnNotifyUserInfoについて詳しく→[[SSPの設定を覚えさせる>SSPに入力されたユーザ情報を使う#qba6f1b9]]

 *OnNotifyUserInfo
 $SSPの呼ばれ方【タブ】(R0)
 $SSPの名前【タブ】(R1)
 
 *初回起動
 $名前【タブ】(when,(変数「SSPの呼ばれ方」の存在),(SSPの呼ばれ方),(when,(変数「SSPの名前」の存在),(SSPの名前),ユーザ))
 :名前を入力してくださいね。\![open,inputbox,ユーザ名,0,(名前)]

としておくと、まずSSP設定の「呼ばれ方」を、それがなければSSP設定の「名前」を、それもなければ『ユーザ』に設定します。~
名前の入力では入力欄に最初からどれかが入ることになります。~
これに下の項で解説した空打ち対策を合わせて使えば、空エンターとボックスを閉じた時の対策は万全と言えます。


**SHIORIイベントで空打ちとキャンセルを弾く [#f078336a]
OnUserInputと、OnUserInputCancelイベントにこの記述を追加します。~
(なお「*OnUserInput」はRポストと狛犬には最初から記述されていますが、この場合は&color(red){$(R0)【タブ】(R1)};の行は削除しておき、入力された情報は個別でセットするようにします。)~
[[is_empty>関数一覧#is_empty]]を使って、空っぽかどうかを判定するものです。~
この関数はMc158-1以降の[[バージョン>情報取得変数#ua674302]]の里々なら、satori_conf.txtの設定不要で使えます。~

 *OnUserInput
 >(R0)をタイムアウト【タブ】(compare,(R1),timeout)
 >(R0)を空打ちされた【タブ】(is_empty,(R1))
 >(R0)を教えてもらった
 
 *OnUserInputCancel
 >(R0)を空打ちされた【タブ】(compare,(R1),close)

 *名前覚えて
 :なんていうお名前なんですか?\![open,inputbox,名前の入力,,(ユーザ名)]
 
 *名前の入力を空打ちされた
 :では、前のままでいいですね。
 
 *名前の入力を教えてもらった
 $ユーザ名【タブ】(R1)
 :(ユーザ名)さんですね、わかりました。

ボックスを閉じた時も「名前の入力を空打ちされた」に飛びます。~

***初回起動と後で変える時は処理を分ける [#p9e9dac3]
初回起動の時に名前を教える処理と、後で名前を変える時の処理は、別々のイベント名にしておくのが無難です。~

 *初回
 :なんていうお名前なんですか?\![open,inputbox,最初の名前入力,,(ユーザ名)]
 
 *最初の名前入力を空打ちされた
 :えー。それじゃ、勝手に呼びますよ?
 
 *最初の名前入力を教えてもらった
 $ユーザ名【タブ】(R1)
 :(ユーザ名)さんですね、わかりました。


**名前が入力されるまで処理をストップさせる [#q89f2128]
実は、入力ボックスが開いたままでも各種イベントは発生します。~
つまり、ボックスが開いていてもユーザーに無視されたり、誤操作で本体にダブルクリックされた時などは、そちらのイベントが始まってしまいます。~
名前の変更イベントならまだしも、もし初回起動イベントの最中だと、意図した動作をしなくなってしまうでしょう。~
そこで、複合テクニックとして、名前入力のイベントを終えるまで他の操作を禁止する方法を挙げます。

 *初回
 :\t\*なんていうお名前なんですか?
 \q[ ,最初の名前入力を空打ちされた]
 \![open,inputbox,最初の名前入力,,(ユーザ名)]
 
 *最初の名前入力を空打ちされた
 :\t\*もー。きちんと教えて下さい。
 \q[ ,最初の名前入力を空打ちされた]
 \![close,inputbox,最初の名前入力]
 \![open,inputbox,最初の名前入力,,(ユーザ名)]
 
 *最初の名前入力を教えてもらった
 $ユーザ名【タブ】(R1)
 :(ユーザ名)さんですね。覚えました。

大きな違いはスクリプトの&color(red){ \t \* \q[~] };の3つです。~
これらを組み合わせることで、入力ボックスを入力するか閉じるかするまで、マウス反応やランダムトークを発生させなくします。

-\t タイムクリティカルセクション。これが宣言されたトークの間は触り反応が起こりません。
-\* これが宣言されたトークの間、選択肢の時間制限を無限にします。
-\q[~] 選択肢のさくらスクリプト。見えない空白の選択肢を紛れ込ませておきます。~
万が一バレてクリックされたとしても、行き先は「空打ちされた」時の処理なので問題ありません。~
そのままでも早々バレる事はないでしょうが、少しでも可能性を消しておきたい場合は、 &color(red){\f[height,0%]\q[ ,最初の名前入力を空打ちされた]\f[height,default]}; のようにして、そこだけフォントサイズを極限まで小さくすればOKです。

動作としては、時間無制限の選択肢が表示されているため、この間はスクリプト再生中なので\tの効果も途切れません。~
これによりマウス反応、ランダムトーク、バルーンを閉じる動作等を抑制できます。~
そして、この状態でも入力ボックスによる操作は受け付けており、結果的に入力ボックス以外からの操作を抑制する動作となるわけです。

なお &color(red){\![close,inputbox,最初の名前入力]}; は入力ボックスを閉じるスクリプトです。~
openの前に実行することで、一度閉じてから開くわけです。(ボックスの多重開放の防止)~
この記述がなくとも動作はしますが、警告音は鳴るのであった方がいいです。


**分岐テクニック [#w10a6c32]
前と同じ名前を入力された時に独自の反応をしたい時など。

 *ユーザ名を教えてもらった
 >前と同じユーザ名を教えられた【タブ】(equal(バイト値、1)(ユーザ名)(バイト値、1)(R1))
 :(ユーザ名)さんですね。覚えました。
 
 *前と同じユーザ名を教えられた
 :今までと同じ(ユーザ名)さんでいいんですね。
 
 *ユーザ名を空打ちされた
 :内緒ですか。
 それでは今まで通り(ユーザ名)さんと呼びますね。

ユーザ名が未入力で初めて入力する場合などにおかしくなってしまうので、前述した[[satori_conf>ファイル構成#j3e3ee70]]で初期名を入力しておくことを推奨。

-もっと複雑なの 
 *ユーザ名を教えてもらった
 $教えた回数=(教えた回数)+1
 >(教えた回数)回目の会話【タブ】(変数「ユーザ名」の存在)==1
 $ユーザ名【タブ】ゆーざ
 >(教えた回数)回目の会話
 
 *1回目の会話
 #ここが初回会話。
 
 *2回目の会話
 #2回目=3回目以降の場合これで。
 $教えた回数=1


#バックアップする場合------------------~
#まずこれを

 *名前を覚えて
 $旧ユーザ名【タブ】(ユーザ名)
 #以下の【タブ】の右側には何もありません。ユーザ名の削除をしています。
 $ユーザ名【タブ】
 \![open,inputbox,ユーザ名]
 
 *ユーザ名を教えてもらった
 $教えた回数=(教えた回数)+1
 >(教えた回数)回目の会話【タブ】(変数「ユーザ名」の存在)==1
 $ユーザ名【タブ】ゆーざ
 >同じお名前【タブ】(compare,(ユーザ名),(旧ユーザ名))==1
 >(教えた回数)回目の会話
 
 *1回目の会話
 #初回会話です。
 
 *2回目の会話
 #2回目=3回目以降の場合の例
 $教えた回数=1
 
 *同じお名前
 #例
 :(ユーザ名)さん・・・ってこの前もそう言ってなかった!?
 :オマエがいかにも忘れてそうだからだろ。

#この場合、ユーザ名、という項目を消しておいて下さい。


*TIPS・敬称の付け方 [#yece19ce]
ユーザ名に敬称を付けたい時、いくつか方法を紹介。

**敬称も含めて入力してもらう [#t141e483]
作る側も手間がかからず、ユーザ側の自由度も高い方法。~

 *名前を変える
 :名前は?\![open,inputbox,ユーザ名]
 めんどうだから「さん」とか「くん」とかも
 一緒に入れちゃってよ。
 
 *ユーザ名教えてもらった
 :これから(ユーザ名)って呼ぶよ。


**関数を使う・基本編 [#xb3937df]
ユーザ名を変更せずに敬称だけ変更したい場合、以下のような仕組みにしておくと(作者にとってもユーザにとっても)便利かもしれません。~
&color(#0000cc){なお変数「ユーザ敬称」に何も入ってないとおかしな事になるので、[[satori_conf.txt>ファイル構成#vf1d9e6e]]で初期値を設定しておくようにします。};
~
まず以下を辞書のどこかにコピペします。~
 @ユーザ呼称
 (ユーザ名)(ユーザ敬称)
「ユーザ呼称」の部分が実際にユーザを呼ぶ場合に(ユーザ呼称)などと書く言葉になります。いっそもっと短縮して「U」などとしてもいいかもしれません。~
~
敬称を選んでもらう部分は例えばこんな風になります。~
''敬称を覚える部分の例''
 *ユーザ敬称選択
 :なんて呼んだらいい?
 今は「(ユーザ呼称)」って呼んでるよ。
 
 _(ユーザ名)さん【タブ】ユーザ敬称選択_さん
 _(ユーザ名)くん【タブ】ユーザ敬称選択_くん
 _(ユーザ名)ちゃん【タブ】ユーザ敬称選択_ちゃん
 
 *ユーザ敬称選択_さん
 $ユーザ敬称【タブ】さん
 :今度からは(ユーザ呼称)って呼ぶよ。
 :さんづけかー。
 *ユーザ敬称選択_くん
 $ユーザ敬称【タブ】くん
 :今度からは(ユーザ呼称)って呼ぶよ。
 :くんづけかー。
 *ユーザ敬称選択_ちゃん
 $ユーザ敬称【タブ】ちゃん
 :今度からは(ユーザ呼称)って呼ぶよ。
 :チャーン!
~
''ユーザを呼ぶ場所の例''
 *
 :(ユーザ呼称)は今何してるの?
 :パソコンじゃないかな。
 :いまどきはタブレットかもよ!

「(ユーザ呼称)」は「ユーザ敬称選択」で選択された「ユーザ敬称」の中身と「ユーザ名」の中身を組み合わせた内容を返します。~
これによって「ユーザ名」「ユーザ敬称」を別々の変数として扱いつつも、「(ユーザ呼称)」とさえ書けば、自動的に二つを組み合わせて呼ぶ事ができます。


**関数を使う・呼び捨ての場合 [#ddd7289f]
単に呼び捨てにして欲しいというユーザさんの需要もあるでしょうし、好感度に応じてさん付けから呼び捨てに変化させるといった表現もあるでしょう。~
~
しかし実は先の例の「ユーザ呼称」そのままだと呼び捨てにはできません。~
単に「ユーザ敬称」を空にしてしまうと、「(ユーザ敬称)」部分がそのまま文字列として残ってしまうため、
 (ユーザ名)(ユーザ敬称)
は
 ユーザ(ユーザ敬称)
のようになってしまうからです。~
参考:[[中身のないからっぽ変数の扱い>変数#i4e87261]]~
~
そこでもう一工夫します。「ユーザ呼称」を以下のように変更してください。
 @ユーザ呼称
 (ユーザ名)(when,(ユーザ敬称)!=呼び捨て,(ユーザ敬称))

敬称選択は例えば次のようにします
 *ユーザ敬称選択
 :なんて呼んだらいい?
 今は「(ユーザ呼称)」って呼んでるよ。
 
 _(ユーザ名)さん【タブ】ユーザ敬称選択_さん
 _(ユーザ名)くん【タブ】ユーザ敬称選択_くん
 _(ユーザ名)ちゃん【タブ】ユーザ敬称選択_ちゃん
 _(ユーザ名)【タブ】ユーザ敬称選択_呼び捨て
 
 #~中略~
 
 *ユーザ敬称選択_呼び捨て
 $ユーザ敬称【タブ】呼び捨て
 :呼び捨てでいいの?
 おう(ユーザ呼称)やきそばパンかってこいや。
 :そこまで下に見ろとは言ってない!

これで、「ユーザ敬称」が呼び捨て以外の場合には今までどおり敬称がつきますが、呼び捨ての場合は「ユーザ名」単体で呼ばれることになります。

**関数を使う・もっといろいろな呼び方をさせる [#dc21e05f]
せっかくなのでもっと色んなパターンで呼べるようにしてしまいます。~
ssu.dllの関数「[[iflist>関数一覧#ifwhenlist]]」を使いますので、もし動かない場合は[[satori_confの設定>ファイル構成#q327057d]]を確認してみてください。
~
まずは「ユーザ呼称」を
 @ユーザ呼称
 (iflist(バイト値、1)(ユーザ敬称)==
     (バイト値、1)呼び捨て(バイト値、1)(ユーザ名)
     (バイト値、1)Mr.(バイト値、1)Mr.(ユーザ名)
     (バイト値、1)Ms.(バイト値、1)Ms.(ユーザ名)
     (バイト値、1)ご主人さま(バイト値、1)ご主人さま
     (バイト値、1)(ユーザ名)(ユーザ敬称)
 )
「(バイト値、1)」については見難いと思いますがそういうものだと思ってそのままコピペしてください。~
参考:[[バイト値>関数一覧#bytes]]、[[引数区切りについて>関数#b92d8132]]

''敬称を覚える部分の例''
 *ユーザ敬称選択
 :なんて呼んだらいい?
 今は「(ユーザ呼称)」って呼んでるよ。
 
 _(ユーザ名)さん【タブ】ユーザ敬称選択_さん
 _(ユーザ名)くん【タブ】ユーザ敬称選択_くん
 _(ユーザ名)ちゃん【タブ】ユーザ敬称選択_ちゃん
 _(ユーザ名)【タブ】ユーザ敬称選択_呼び捨て
 
 _Mr.(ユーザ名)【タブ】ユーザ敬称選択_Mr.
 _Ms.(ユーザ名)【タブ】ユーザ敬称選択_Ms.
 _ご主人さま【タブ】ユーザ敬称選択_ご主人さま
 
 #~中略~
 
 *ユーザ敬称選択_Mr.
 $ユーザ敬称【タブ】Mr.
 :Hey,(ユーザ呼称)!
 :トークが英語になったりはしないから安心してな。
 *ユーザ敬称選択_Ms.
 $ユーザ敬称【タブ】Ms.
 :Hey,(ユーザ呼称)!
 :What time is it now?
 *ユーザ敬称選択_ご主人さま
 $ユーザ敬称【タブ】ご主人さま
 :はいはい(ユーザ呼称)。
 :もっとやる気だそうよ。

これで(ユーザ呼称)とすると、敬称によっては
 Mr.ユーザ
のようにユーザ名の前に敬称部分が来たり、
 ご主人さま
のように、ユーザ名の情報は保持しつつもまったくユーザ名を無視した呼び方もできます(もはや敬称じゃないですが)。~
~
もしパターンを追加したい場合は「ユーザ呼称」の部分に
 @ユーザ呼称
 (iflist(バイト値、1)(ユーザ敬称)==
     (バイト値、1)同志(バイト値、1)同志(ユーザ名)
     (バイト値、1)呼び捨て(バイト値、1)(ユーザ名)
     #~略~
 )
の「同志」の行のように
 (バイト値、1)[ユーザ敬称の中身](バイト値、1)[出力パターン]
という書式で追加していきます。~
~
なお一番下の~
 (バイト値、1)(ユーザ名)(ユーザ敬称)
の行は一番下以外の場所にもっていくとおかしくなるので注意してください。~
~
ちなみに、括弧の展開数が多いので理論上は多少処理に時間がかかりますが、ユーザ呼称を百回も連呼するような怖いケースでなければ知覚できる程にはならないはずです。






*選択肢で覚えさせる [#f252a61a]
インプットボックスを使わず、選択肢でユーザ名を決定させる方法。

 *名前覚えろ
 :あなたはあたしの・・・・・
 
 _ユーザさん
 _お兄ちゃん
 _パパ
 
 *ユーザさん
 $ユーザ名=ユーザさん
 :えー!!(ユーザ名)?
 ホントにそれでいいのー?
 
 *お兄ちゃん
 $ユーザ名=お兄ちゃん
 :%username・・・・・・
 (5)宜しくねっ!!
 
 *パパ
 $ユーザ名=パパ
 :うん。あなたが、あたしの(ユーザ名)ね。

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