よくあるトラブルシューティングみたいなものまとめ。
まずは里々は整備班カスタムの最新版を使おう。
新たに追加された関数や変数も多いので、古いものだと扱えなかったり、バグがあったりする。
このページで書かれている問題と対処法も、里々のバージョンアップによって解決することがある。
他に、少し高度になるがれしばを使うと挙動を追いやすくなる。
使っているベースウェアがSSPならこちらも最新のバージョンにしておこう。
とりあえず大雑把に以下の5点を疑ってみよう。
ブラウザで表示して、そこからコピーしてきたコードには、書いた人の意図と違う余計な空白などが含まれることがある。
例えば行の前後に半角空白があったり、タブが空白になっていたり。
$変数 変数に入れる内容
や
>ジャンプ先 ジャンプ条件
などの場合、間に入るのはスペースではなくタブだ。確認してみよう。
また、【タブ】等と表記されてる場合もある。これもTabキーで置き換えよう。
記述してもウンともスンとも言わない場合は以下を疑おう。
「ポストと狛犬」に同梱されてる「れしば.exe」を起動してみよう。
その状態でゴーストを起動すると、中で何が起こってるかがわかる。
また、掲示板等で助けを求める場合にも、れしばで表示される内容は役に立つことが多い。
計算式に何か問題があるようだ。
中身がない、何も定義されていない変数に計算をしようとしていないかチェック。
前述の「れしば.exe」を立ち上げて、どこでそれが発生しているのか確認してみよう。
他にも、計算式の中に演算に使える文字が混入していないかをチェックしておくと吉。
>ハラヘリー【タブ】(満腹度)<20
この例では(満腹度)が空っぽだとエラーになりやすい。
四則演算や比較演算問わず、satori_conf.txtで初期値を設定しておこう。
たぶん、SAORIの引数が間違ってる。SAORIの説明書を読みなおそう。
問題を分解しよう。その機能を構成する要素を、一つ一つ動作確認していこう。シンプルな辞書で試してみよう。
つまっている場所がわかれば、人に聞く場合でも適切な質問ができる。
辞書ファイルをいったん別のフォルダにコピーして、必要最小限の辞書だけで動かしてみよう。
正常に動く状態から、少しずつ変更していって、原因を突き止めよう。
*OnMouseDoubleClick >(R3)(R4)つつかれ ()
辞書から消してないか確認。
消えてたら、ポストの辞書から持ってこよう。
ただし、最近の里々ではこの記述と同じ動作がそのまま組み込まれている。
つまり、反応がないということは、このイベントに別の記述がされていたり、ジャンプ先でエラーを起こしている可能性が高い。
replace_after.txtに登録された置換の影響で、右クリックメニュー/選択肢上の「・」「‥」「…」「。」「、」などにウェイトタグが出る場合がある。
これはエスケープ記号φ(ファイ)をつけることで、その直後の文字が置換されないようにできる。
例) 辞書上:……おすすめ?(&R) → メニュー上:…\w3…\w3おすすめ?\w8(&R) 辞書上:φ…φ…おすすめφ? → メニュー上:……おすすめ?
(注・実際にエスケープすべき文字は、そのときのreplace_after.txtの内容によって異なる。上の例はreplace_after.txtに「…」「?」が設定されている場合。)
さおり呼び出しの結果を表示するなど「何を表示するか実行時までわからない」場合には、ssu.dllのreplaceコマンドで置き換える。
例) (replace(byte1)(出力したい文字列)(byte1)…(byte1)φ…) (注・$byte1はバイト値1。 *OnSatoriLoadなどに $byte1【タブ】(sprintf,%c,1) であらかじめ設定しておく。 変数「$出力したい文字列」に「、」「,」が含まれる場合に、 さおり呼び出しの区切り文字と誤認されるのを防ぐため)
里々には「自動でサーフェスを規定値に戻す」仕組みがあります。
(1) トーク直前(スクリプト冒頭)
(2) トーク後に一定時間経過した時
この二箇所のタイミングで発生し、予め設定されたデフォルトサーフェスに戻るスクリプトが挿入されます。
デフォルトサーフェスは初期状態では下記のように設定されています。
$デフォルトサーフェス0【タブ】0 $デフォルトサーフェス1【タブ】10
この状態では、全てのトークの先頭に \0\s[0]\1\s[10] が挿入されることになります。
ただし、スクリプトの最初に \s[ID] などサーフェス変更スクリプトが使われていた場合(トークの最初に(5)とかがあった場合)はそちらが優先され、デフォルトサーフェスへの変更は行われません。
この機能をOFFにするには、特殊変数の$会話時サーフェス戻しを使用します。
このコマンドで無効を指定した時点からサーフェスの自動変更が停止します。
$会話時サーフェス戻し【タブ】無効
(1)(2)を個別に有効・無効の設定はできません。
つまり、無効にすると(2)トーク後に一定時間経過した時にもサーフェスが戻らないため、次のトークが来るまでずっと前回最後のサーフェスのままになります。これをなんとかしたい場合は「会話時サーフェス戻し」は弄らず、「今回は会話時サーフェス戻し」を使いましょう。
$今回は会話時サーフェス戻し【タブ】無効
これを特定のスクリプトの時だけ使う事で、個別にサーフェススクリプトの自動挿入を制御できます。
何かのタイミングで、意図しない(マウスクリックも、タイムアウトもしていない)のにバルーンが勝手に消えてしまう場合、何らかのイベントが通知されている可能性があります。
例えば、mciaudior.dllを使っていると、曲が終了した時にOnMAAPlayFinishが通知され、バルーンが消える…といった具合です。
これを防ぐ方法は、通知されているイベントを特定し、そのイベントに$スクリプトの一番頭【タブ】\C又は$今回は喋らない【タブ】有効を記述するのが有効です。
シェルのインストールや切替時にもバルーンが消えたりする事例が報告されています。
SHIORI イベントリストのOnShellChanged、OnShellChangingなどに注目。
また、これらのシェルやバルーン関連のイベントはトークを書いてない場合でも上書きで発生するという特性があります。例えば、
* :\![change,balloon,○○]バルーンを○○に変更したよ。
と書いても、\![change,balloon,○○]を実行した時点で新たにイベントが発生するため、「バルーンを○○に変更したよ」と喋る前に上書きされてしまうのです。当然、トークがない場合はただバルーンが消えてしまう。
シェルをインストール→インストールしたシェルに変更、でトークをしてくれないケースも基本的にはこれと同じ。ここでは文の中で連続で喋らせる事は諦め、OnBalloonChangedなど発生したイベントの中で続きのトークを書くように(バルーンを消したくない場合は\Cなどを活用)しましょう。
たまに $次のトーク【タブ】 が動作しないというのを見るのですがこの後に $手動セーブ【タブ】実行 を行い、かつ*OnSatoriBootや*OnSatoriLoadで $トーク予約のキャンセル【タブ】* を記入しているとトークの予約を消されてしまうことが分かった
新もどき板 里々質問用スレッド2 No.65より引用
対策はOnDestroyでトーク予約のキャンセルとか
OnTranslateでトーク全文に対して関数で処理をしようとしていませんか?
関数の区切り字と同じ文字がトーク中に出現すると、このエラーがでます。
またOnTranslateはれしばに拾われません。
尚、トーク中に選択肢が含まれる場合、トーク中にバイト値1が存在する可能性が高いので注意してください。
参考:引数区切り問題
選択肢で使うreference情報は里々が内部で使用するために加工が施されています。
このため里々の選択肢記法「_」や、さくらスクリプトの\q[...]タグがトーク中に存在していると、トーク中に必ずバイト値1が含まれることになり、従って関数の区切り字に「、」や「,」だけでなくバイト値1も使用できなくなります。
そんな時は選択肢はさくらスクリプトの
\__q[選択ID]選択ラベル\__q
を使ってみましょう。
代わりに選択肢関係の情報取得変数も使えなくなる(更新されなくなる)事にも注意して下さい。
*aが押された >初回起動
みたいなものを作っておけばaキーを押すだけでトークを確認できるが、これだと初期状態のキャラクター表示が実際の動作と異なる場合があるので、最終的にはちゃんとテストすること。
ちなみにキー操作に反応させる為には
*OnKeyPress >(R0)が押された
という記述が別途必要となる。既存のゴーストを改造して作っているのなら(たぶん)最初から書いてあるはず。
(笑)とか(wとかしゃべらせたいのに、括弧が出てこない!
そういうときはφ(ふぁい)を使います。
φ(と記述してカッコを始めることで、置き換え等の特殊機能を抑制し、単なるカッコとして出力することができます。
また、カッコ内で閉じカッコを表示したい場合は φ) で可能。
もちろん、置き換え対象が無い場合はそのままカッコつきで出力されます。
#「(w」「(笑)」としゃべらせたい時 @例1 φ(w @例2 φ(笑φ)
satori_confの
$スコープ切り換え時【タブ】\n[half]
を
$スコープ切り換え時【タブ】\n[half]\w8
にするとか。
要らない時は随時
$スコープ切り換え時【タブ】\n[half] :ここの切り換えは! :即時に! $スコープ切り換え時【タブ】\n[half]\w8
と。
(さくらスクリプトでトークを書いている人は「$さくらスクリプトによるスコープ切り換え時」)
あと、
$自動挿入ウェイトの倍率【タブ】0
になってるのが意図的なものではないなら
$自動挿入ウェイトの倍率【タブ】100
とか
$自動挿入ウェイトの倍率【タブ】200
とかすると、喋った長さに応じて待ちます。こっちは句読点でも待ちますが。
指定するのはパーセント単位の倍率。
いずれも、satori_savedata.txtを一回消さないと反映されないかも。
まず里々でユーザー入力やファイル名等で外部から(){全角丸括弧}入りの文字列が入ってきた場合の挙動が分かり難いので纏めます。
まず、OnFileDrop や OnUserInput イベントで取得したリファレンス(R?)の中に(){全角丸括弧}が入っていても、リファレンス(R?)を直接表示等を行う分には括弧展開されません。
*OnFileDrop2 :\_q\_!(R0)\_!\_q
*OnUserInput :(R1)
次にリファレンス(R?)を、変数に【タブ】や set 関数を使って代入して、その変数を使っても括弧展開されません。(セーブデータを見ると括弧の前にφが自動挿入されて無効化しているのが分かります)
*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))
以上が基本的な挙動です、ユーザー名など変数に保存して使うだけで、文字列処理系の関数を使って文字列操作したりするのでなければ特別な処理は必要ありません。変数に=を使って代入だけしない様に注意して下さい。
以上の挙動を理解した上で括弧展開しない様に何とか対策を立てることは可能です。
まずYAYA as SAORI で、ファイルリスト取得(FENUM関数)やテキストファイル読出(FREAD関数)などは関数返り値で値を渡すのでファイル名やファイル内に()があると括弧展開されてしまいます… yaya as saori 側の関数を配列返り値(S0)で返す様に改造して対応する事が出来ます。→改造例
最後に、外部から取得した()入りの文字列を関数を使って操作したい場合はどうするか…
「里々(文字列処理)の道は茨の道。さりとて、戻ることはかなわぬのです。」
外部サイト「伺的なフォーラム」の「里々での開発相談」に質問をするのも手です。
(リンク先上部に記述されている共有アカウントでログインしないと書き込めない点に注意)
Twitterで #伺か #ukagaka などのタグを添えてツイートすると教えてもらえる場合もあります。
掲示板で質問してみる? 質問の際はできるだけ詳しい情報を添えて。
ゴースト回覧板/ゴーストをつくろうとしてる人たちが話すスレ
散歩してきなさい。