最新の10件2019-11-26RecentDeleted2019-08-22ネットワーク更新2019-07-01伝言板ポストと狛犬2019-04-11情報取得変数2019-02-04特殊変数2018-12-31関数一覧2018-12-04閏年を判定するTIPS総合れしばの使い方この記事を参考に、新しい里々に入れ替えよう。他にも、少し高度になるがれしばを使うと挙動を追いやすくなる。初回起動のテストをしたいカッコを無効化したいスコープ切り換え時の自動ウェイトをなんとかしたいユーザー入力やファイル名など外部から取得した文字列の中の()が展開されてしまう。里々は整備班カスタムの最新版を使おう。旧いものだと扱えない関数があったり、バグがあったりするぞ。ベースウェアがSSPならこちらも最新のバージョンにしておこう。†とりあえず大雑把に以下の5点を疑ってみよう。タブ・スペース・全角・半角の間違いバグ筆頭。あるミスながら、慣れていても付きまとってくるイヤ〜なやつ。後述するようにコピペした時にも注意が必要。タブとスペース(全角・半角)は可視化できるエディタを使うことでかなり予防できるし、発見もしやすくなる。条件式のミス原因が分かっても何がおかしいか分かりにくいイヤ〜なやつ。()で呼び出す変数が存在しなかったり、記号が含まれたりした時の予想外の動作がよく起こる。里々ではトークも単語群も変数も関数も言い方が違うだけで実体は同じもの。変数への代入方法$に代入する時に【タブ】と=を間違えていないか確認してみよう。計算させたい時に【タブ】を使ってたり、させたくない時に=を使ってたりすると、変数の中身が変なことになる。括弧の対応がおかしくないか調べてみよう。閉じる括弧が半角になってたりとか。括弧の全角半角が一致して正しく閉じていないと、その行より先にある全てが動作しなくなる。ジャンプ先があるのにジャンプしてくれないとか、正しい記述なのに他が動かない時、突然まったく関係ない所が動かなくなった時は、こういうミスがある可能性を疑ってみよう。テキストエディタで半角の括弧を一文字ずつ検索してみるといいかも。意図的に括弧を文字として使いたい場合は、φを使うこと。†ブラウザで表示して、そこからコピーしてきたコードには、書いた人の意図と違う余計な空白などが含まれることがある。行の前後に半角空白があったり、タブが空白になっていたり。変数に入れる内容や>ジャンプ先ジャンプ条件などの場合、間に入るのはスペースではなくタブだ。【タブ】等と表記されてる場合もある。これもTabキーで置き換えよう。†それはssu.dllが提供する関数ではないだろうか?内部関数(call、loop、setなど)は里々単体で使用できるが、ssu.dllの関数はsatori_conf.txtで正しく定義しないと使えない。関数を実行しても、実際には関数名などがそのまま括弧つきで出てくるような場合は間違いは無い。里々最新版ではssuが不要になっているので、また別の原因がありそうだ。記述しているのに意図した動作をしない場合、引数区切り問題に引っかかっている可能性もある。「ポストと狛犬」に同梱されてる「れしば.exe」を起動してみよう。その状態でゴーストを起動すると、中で何が起こってるかがわかる。掲示板等で助けを求める場合にも、れしばで表示される内容は役に立つことが多い。計算式に何か問題があるようだ。中身がない、何も定義されていない変数に計算をしようとしていないかチェック。前述の「れしば.exe」を立ち上げて、どこでそれが発生しているのか確認してみよう。他にも、計算式の中に演算に使える文字が混入していないかをチェックしておくと吉。>ハラヘリー【タブ】(満腹度)<20この例では(満腹度)が空っぽだとエラーになりやすい。四則演算や比較演算問わず、satori_conf.txtで初期値を設定しておこう。†たぶん、SAORIの引数が間違ってる。SAORIの説明書を読みなおそう。その機能を構成する要素を、一つ一つ動作確認していこう。シンプルな辞書で試してみよう。つまっている場所がわかれば、人に聞く場合でも適切な質問ができる。辞書ファイルをいったん別のフォルダにコピーして、必要最小限の辞書だけで動かしてみよう。正常に動く状態から、少しずつ変更していって、原因を突き止めよう。†*OnMouseDoubleClick>(R3)(R4)つつかれ()辞書から消してないか確認。消えてたら、ポストの辞書から持ってこよう。最近の里々ではこの記述と同じ動作がそのまま組み込まれている。反応がないということは、このイベントに別の記述がされていたり、ジャンプ先でエラーを起こしている可能性が高い。†ジャンプ先が存在するか確認する。条件式を展開してみて想定した挙動を示すか確認する。【タブ】が全角・半角スペース等になっていないか確認する。replace.txtやreplace_after.txtに【タブ】をタブ文字にする定義があるか確認する。他の人にも確認してもらう。†replace_after.txtに登録された置換の影響で、右クリックメニュー/選択肢上の「・」「..」「...」「。」「、」などにウェイトタグが出る場合がある。これはエスケープ記号φ(ファイ)をつけることで、その直後の文字が置換されないようにできる。メニュー上:......おすすめ?(注・実際にエスケープすべき文字は、そのときのreplace_after.txtの内容によって異なる。上の例はreplace_after.txtに「...」「?」が設定されている場合。)さおり呼び出しの結果を表示するなど「何を表示するか実行時までわからない」場合には、ssu.dllのreplaceコマンドで置き換える。例)(replace(byte1)(出力したい文字列)(byte1)...(byte1)φ...)(注・$byte1はバイト値1。里々には「自動でサーフェスを規定値に戻す」仕組みがあります。トーク後に一定時間経過した時この二箇所のタイミングで発生し、予め設定されたデフォルトサーフェスに戻るスクリプトが挿入されます。デフォルトサーフェスは初期状態では下記のように設定されています。挿入されることになります。サーフェス変更スクリプトが使われていた場合(トークの最初に(5)とかがあった場合)はそちらが優先され、デフォルトサーフェスへの変更は行われません。この機能をOFFにするには、特殊変数の$会話時サーフェス戻しを使用します。このコマンドで無効を指定した時点からサーフェスの自動変更が停止します。$会話時サーフェス戻し【タブ】無効(1)(2)を個別に有効・無効の設定はできません。無効にすると(2)トーク後に一定時間経過した時にもサーフェスが戻らないため、次のトークが来るまでずっと前回最後のサーフェスのままになります。これをなんとかしたい場合は、イベントOnSurfaceRestoreを使い、自分で組みましょう。上記の$会話時サーフェス戻しに関連する問題と思われます。これは「トークの最初にサーフェス指定していない時、デフォルトサーフェスに戻すスクリプトを挿入する」機能ですが、里々が内部で”最初にサーフェス指定していない判定”に失敗した場合は自動挿入が行われないため、サーフェスが何も指定されない状態になっていると思われます。サーフェス指定をいれてみましょう。行末をφでエスケープしても改行されたり、\1側でトークが始まる前に改行されていたりする現象です。里々では、ベースウェアが表示するトークを記述しているかどうかで処理が変わってきます。*(例1)(例2)*例1$ほげ【タブ】4$好感度=(好感度)+1*例2:トーク見ての通り、(例1)は処理系だけの文、(例2)はトークを書いた文です。この例でランダムトークを実行した時は大丈夫。(例1)にあるような、$や>だけで構成された文は、里々が自動でトークを表示しないものとして判断するので、続く文(例2)にあるトークと競合せず、正しく表示されます。ところが、もし(例1)内にトークを書いてしまうと、スコープなどが混同して、文(例2)が始まる時に勝手に改行が挟まれたりしてしまう。ここらへんの処理の流れは、里々を相当理解していないと難しいです。よって解決法...というより予防法は文*を一度に複数呼び出す場合、トークを書くのはその中の一つだけにする一行で収まるものは単語群@を活用する(こちらは行末に改行がつかないため)などが有効です。他にも、@の中で関数やSAORIを使い、さらに@を呼び出した時にも発生します。トーク中に()で文や単語群を呼び出し、そこからさらに呼び出しを重ねるなどをしても発生することがあるようです。「中身のない変数を使う」ことでもこの改行現象が発生します。↓ケースバイケース例。OK(!)基本的には「>」の中だとか「$」の中だとかお構いなしです。逆に、文字列でも数字でもなんでもいいからその変数に何か入っていれば改行を防げます。このケースに関してはsatori_conf.txt内の「*初期化」にて変数の初期値を設定して防ぎましょう。†ここまでは発生を抑える対策ですが、以下は発生したものは仕方ないとして諦め、表示させない手段を紹介します。トークする直前に\cか、\_l[0,0]を入れて強制的に戻す一元化するのに苦労しますが、確実です。使うトークと直前の処理系が分かれているケース限定。処理系が終了後にraiseでトークを呼び出す事で、全ての表示座標が0,0に戻ります。イベント上では一度区切ることになるため、トークとトークの合間に使うのは難しい(\Cなどを活用すれば可能)スクリプトログなどを参照し、特定のものをreplace_after.txtなどで置換するダミーの表示されないスクリプトなどを埋め込み、まとめて置換する方法。スクリプトログを汚したくない人向け。何かのタイミングで、意図しない(マウスクリックも、タイムアウトもしていない)のにバルーンが勝手に消えてしまう場合、何らかのイベントが通知されている可能性があります。mciaudior.dllを使っていると、曲が終了した時にOnMAAPlayFinishが通知され、バルーンが消える...といった具合です。これを防ぐ方法は、通知されているイベントを特定し、そのイベントに$スクリプトの一番頭【タブ】\C又は$今回は喋らない【タブ】有効を記述するのが有効です。†シェルのインストールや切替時にもバルーンが消えたりする事例が報告されています。イベントリストのOnShellChanged、OnShellChangingなどに注目。これらのシェルやバルーン関連のイベントはトークを書いてない場合でも上書きで発生するという特性があります。*:\![change,balloon,○○]バルーンを○○に変更したよ。書いても、\![change,balloon,○○]を実行した時点で新たにイベントが発生するため、「バルーンを○○に変更したよ」と喋る前に上書きされてしまうのです。トークがない場合はただバルーンが消えてしまう。シェルをインストール→インストールしたシェルに変更、でトークをしてくれないケースも基本的にはこれと同じ。†OnTranslateでトーク全文に対して関数で処理をしようとしていませんか?関数の区切り字と同じ文字がトーク中に出現すると、このエラーがでます。OnTranslateはれしばに拾われません。トーク中に選択肢が含まれる場合、トーク中にバイト値1が存在する可能性が高いので注意してください。†ghostフォルダ内のmasterフォルダ内にあるprofileフォルダを削除すれば初回起動になる。satori_savedata.txt、satori_savebackup.txtも削除しておくべき。初回起動のトーク内容の具合を確認するだけならば、*aが押された>初回起動みたいなものを作っておけばaキーを押すだけでトークを確認できるが、これだと初期状態のキャラクター表示が実際の動作と異なる場合があるので、最終的にはちゃんとテストすること。ちなみにキー操作に反応させる為には*OnKeyPress>(R0)が押されたという記述が別途必要となる。既存のゴーストを改造して作っているのなら(たぶん)最初から書いてあるはず。†(笑)とか(wとかしゃべらせたいのに、括弧が出てこない!そういうときはφ(ふぁい)を使います。φ(と記述してカッコを始めることで、置き換え等の特殊機能を抑制し、単なるカッコとして出力することができます。置き換え対象が無い場合はそのままカッコつきで出力されます。†satori_confの$スコープ切り換え時【タブ】\n[half]を$スコープ切り換え時【タブ】\n[half]\w8にするとか。要らない時は随時$スコープ切り換え時【タブ】\n[half]:ここの切り換えは!:即時に!$スコープ切り換え時【タブ】\n[half]\w8と。(さくらスクリプトでトークを書いている人は「$さくらスクリプトによるスコープ切り換え時」)あと、$自動挿入ウェイトの倍率【タブ】0になってるのが意図的なものではないなら$自動挿入ウェイトの倍率【タブ】100とか$自動挿入ウェイトの倍率【タブ】200とかすると、喋った長さに応じて待ちます。こっちは句読点でも待ちますが。指定するのはパーセント単位の倍率。いずれも、satori_savedata.txtを一回消さないと反映されないかも。↑ユーザー入力やファイル名など外部から取得した文字列の中の()が展開されてしまう。†まず里々でユーザー入力やファイル名等で外部から(){全角丸括弧}入りの文字列が入ってきた場合の挙動が分かり難いので纏めます。イベントで取得したリファレンス(R?)の中に(){全角丸括弧}が入っていても、リファレンス(R?)を直接表示等を行う分には括弧展開されません。関数を使って代入して、その変数を使っても括弧展開されません。(セーブデータを見ると括弧の前にφが自動挿入されて無効化しているのが分かります)*OnUserInput$ユーザ名【タブ】(R1):(ユーザ名)ただし、リファレンス(R?)を変数に=を使って代入すると括弧展開されてしまいます、文字列を=で代入するのはやめておきましょう。*OnUserInput$ユーザ名=(R1):(ユーザ名)次に(){全角丸括弧}が入ってるリファレンス(R?)や変数を、関数を使って文字列操作した場合に関数返り値は括弧展開されてしまいます。*OnFileDrop2$,【タブ】(バイト値,2)$引数区切り追加【タブ】(,):\_q\_!(replace(,)(R0)(,)\(,)/)\_!\_qただし関数の配列返り値(S0)だと括弧展開されません。*OnFileDrop2$,【タブ】(バイト値,2)$引数区切り追加【タブ】(,):\_q\_!(nop(,)(split(,)(R0)(,)\))(for,0,(Sの数)-1,(lp))\_!\_q@lp(if,(C0)!=0,/)(S(C0))以上が基本的な挙動です、ユーザー名など変数に保存して使うだけで、文字列処理系の関数を使って文字列操作したりするのでなければ特別な処理は必要ありません。変数に=を使って代入だけしない様に注意して下さい。以上の挙動を理解した上で括弧展開しない様に何とか対策を立てることは可能です。側の関数を配列返り値(S0)で返す様に改造して対応する事が出来ます。返り値を配列返り値(S0)で返すようにssuと同等の関数を改造&自作する。みち氏(){全角丸括弧}を別の文字(例えば半角の丸括弧)に変換して括弧展開されない様にする。「里々(文字列処理)の道は茨の道。戻ることはかなわぬのです。質問の際はできるだけ詳しい情報を添えて。